导轨 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?