Rails 3.2: цепочка на лямбдах?
-
12-12-2019 - |
Вопрос
в моих рельсах 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" }
.