这可能比其他任何东西都更像Ruby语法。我很难在SomeObject.find上获得两个限制条件。
分开,条件似乎有效:
if search != ''
find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
else
find(:all, :conditions => ['active', 1]).shuffle
end
第一种情况我想要的是:
find(:all, :conditions => ['name LIKE ?', "%#{search}%"], ['active', 1])
但该行抛出syntax error, unexpected ')', expecting tASSOC
。
答案 0 :(得分:16)
Rails 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])
Rails 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?
答案 1 :(得分:2)
不是使用if-else
而是需要冗余来检查active = 1
,而是使用更简单的语法:
result = where(:active => 1)
result = result.where('name like ?', "%#{search}%") unless search.blank?
就您所看到的错误而言,它似乎不会由您发布的代码引起。堆栈跟踪可能有助于进一步缩小范围...
答案 2 :(得分:2)
我认为你正在使用rails 2
试试这个。
find(:all, :conditions => ['name LIKE ? and active = 1', "%#{search}%"])
rails 3语法
where('name LIKE ? and active = 1', "%#{search}%")
答案 3 :(得分:0)
对于Rails 4,在rails new find_by和find_by!方法介绍