Ответ 1
Рельсы 2
find(:all, :conditions => ['name LIKE ?', "%#{search}%"], ['active', 1])
не является надлежащим синтаксисом для передачи хэшей методу. Вы можете оставить фигурные скобки от хэша, если это последний аргумент метода, но в этом случае вы передаете массив как последний аргумент.
Используйте вместо этого следующее:
find(:all, :conditions => ["name LIKE ? AND active = ?", "%#{search}%", 1])
или
params = {:search => "%#{search}%", :active => 1}
find(:all, :conditions => ["name LIKE :search AND active = :active", params])
Рельсы 3 и 4
Вероятно, вы захотите сделать что-то более похожее на следующие версии Rails:
scope :active, -> { where(active: true) }
scope :name_like, ->(search) { where("name LIKE ?", "%#{search}%") }
И тогда вы бы назвали это следующим образом:
YourModel.active.name_like("Bunnies")
Это позволяет повторно использовать эти конкретные запросы в разных комбинациях во всем приложении. Это также делает код, считывающий данные, очень легко читаемыми.
Если вам не нравится синтаксис scope
, вы также можете определить его как методы класса:
def self.active
where(active: true)
end
def self.name_like(search)
where("name LIKE ?", "%#{search}%")
end
Вы также можете управлять областями на лету. Это позволит вам начать создание цепочки объектов отношений, а затем выбрать включение других на основе условий. Вот как это могло бы выглядеть при применении к исходному вопросу для достижения тех же результатов:
results = active
results = results.name_like(search) if search.present?