11

这可能更像是一个 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

4

4 回答 4

17

导轨 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?
于 2013-05-23T14:55:09.250 回答
2

而不是使用if-elsewhich 会涉及检查的冗余active = 1,更简单的语法将是这样的:

result = where(:active => 1)
result = result.where('name like ?', "%#{search}%") unless search.blank?

就您看到的错误而言,它似乎不是由您发布的代码引起的。堆栈跟踪可能有助于进一步缩小范围......

于 2013-05-23T14:39:14.997 回答
2

我想你正在使用 rails 2

尝试这个。

find(:all, :conditions => ['name LIKE ? and active = 1', "%#{search}%"])

轨道 3 语法

where('name LIKE ? and active = 1', "%#{search}%")
于 2013-05-23T14:54:10.773 回答
0

对于 Rails 4,在 rails 中新增 find_by 和 find_by!方法介绍

阅读答案

于 2016-01-31T06:47:28.280 回答