Вопрос

в моих рельсах 3.2.8 приложение у меня есть некоторые названные области, которые я хотел бы объединить в некоторых обстоятельствах.

Так, например, у меня есть эти два облагания:

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) }
.

Я использую их отдельно, но я также хотел бы позвонить им вместе, как это:

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

Когда я стараюсь, чтобы он жалуется, что in_date_range не является методом массива.

Но у меня есть еще один объем,

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

и если я сделаю

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

Это работает! По-видимому, активный охват возвращает отношение, в то время как лямбда обладает массивами возврата, и поэтому не может быть цепочками.

Я хотел бы знать, почему разница между простыми областями и лямбдами, как параметры влияют на него, и есть ли что-нибудь, что я могу сделать в коротком написании комбинированного применения, который я сделал.

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) }
.

работает, но не очень сухим (так как мне нужны отдельные области) или рельсы-ish. Поиск здесь и в других местах, я видел подобные вопросы, но никто, который, кажется, применимы к этой ситуации, где я пытаюсь цепить два лямбда с параметрами.

Это было полезно?

Решение

Это происходит потому, что в вашем объеме

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

Metods all и find_all_by_status возвращает Array вместо ActiveRecord::Relation.Например, вы должны заменить его генеракодицетагкодом.

scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top