我想在某些名称列表中查找 created_on >= some date AND name 组合的记录。
对于 ">=" 我必须使用 sql 条件。对于“IN”,我必须使用条件哈希,其中键是 :name,值是名称数组。
有没有办法将两者结合起来?
我想在某些名称列表中查找 created_on >= some date AND name 组合的记录。
对于 ">=" 我必须使用 sql 条件。对于“IN”,我必须使用条件哈希,其中键是 :name,值是名称数组。
有没有办法将两者结合起来?
您可以在 rails 2.1 及更高版本中使用命名范围
Class Test < ActiveRecord::Base
named_scope :created_after_2005, :conditions => "created_on > 2005-01-01"
named_scope :named_fred, :conditions => { :name => "fred"}
end
那么你可以做
Test.created_after_2005.named_fred
或者你可以给 named_scope 一个允许你传入参数的 lambda
Class Test < ActiveRecord::Base
named_scope :created_after, lambda { |date| {:conditions => ["created_on > ?", date]} }
named_scope :named, lambda { |name| {:conditions => {:name => name}} }
end
那么你可以做
Test.created_after(Time.now-1.year).named("fred")
如果您使用的是旧版本的 Rails,Honza 的查询很接近,但您需要为置于 IN 条件中的字符串添加括号:
Person.find(:all, :conditions => ["created_at > ? AND name IN (?)", date, names])
使用 IN 可能是一个混合包:整数最快,字符串列表最慢。如果您发现自己只使用一个名称,请务必使用等号运算符:
Person.find(:all, :conditions => ["created_at > ? AND name = ?", date, name])
named_scopes 最酷的地方在于它们也适用于集合:
class Post < ActiveRecord::Base
named_scope :published, :conditions => {:status => 'published'}
end
@post = Post.published
@posts = current_user.posts.published
有关 named_scopes 的更多信息,请参阅Ryan 的公告和有关 named_scopes 的 Railscast
class Person < ActiveRecord::Base
named_scope :registered, lambda { |time_ago| { :conditions => ['created_at > ?', time_ago] } }
named_scope :with_names, lambda { |names| { :conditions => { :names => names } } }
end
如果要将变量传递给作用域,则必须使用 lambda。
您可以链接where
子句:
Person.where(name: ['foo', 'bar', 'baz']).where('id >= ?', 42).first
已经提出的命名范围非常好。经典的方法是:
names = ["dave", "jerry", "mike"]
date = DateTime.now
Person.find(:all, :conidtions => ["created_at > ? AND name IN ?", date, names])
我想我要么使用简单的 AR finders 要么Searchgasm。