Pregunta

En mi aplicación Rails 3.2.8 tengo algunos ámbitos con nombre que me gustaría encadenar en algunas circunstancias.

Así, por ejemplo, tengo estos dos ámbitos:

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }
scope :in_date_range, lambda { |start_date, end_date| includes([:person, :pier_module]).where("(status_date >= ?) AND (status_date <= ?)", start_date, end_date) }

Los uso por separado, pero también me gustaría poder juntarlos así:

WorkRequest.by_status("Accepted").in_date_range("2012-01-01", "2012-10-02")

Cuando lo intento, se queja de que in_date_range no es un método de Array.

Pero tengo otro alcance,

scope :active, includes([:person, :pier_module]).where("status = 'New Request'")

y si lo hago

WorkRequest.active.in_date_range("2012-01-01", "2012-10-02")

¡funciona!Aparentemente, el ámbito activo devuelve una relación, mientras que los ámbitos lambda devuelven matrices y, por lo tanto, no se pueden encadenar.

Me encantaría saber por qué la diferencia entre ámbitos más simples y ámbitos lambda, cómo lo afectan los parámetros y si hay algo que pueda hacer además de escribir un alcance combinado, lo cual he hecho.

scope :by_status_in_date_range, lambda { |status, start_date, end_date|  includes([:person, :pier_module]).where("(status = ?) AND (status_date >= ?) AND (status_date <= ?)", status, start_date, end_date) }

Funciona, pero no muy SECO (ya que también necesito los visores individuales) o Rails-ish.Al buscar aquí y en otros lugares, he visto preguntas similares, pero ninguna parece aplicarse a esta situación, en la que intento encadenar dos lambdas con parámetros.

¿Fue útil?

Solución

Eso sucede porque en tu alcance

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }

métodos all y find_all_by_status devoluciones Array en lugar de ActiveRecord::Relation.Deberías reemplazarlo con where Por ejemplo.

scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top