我想在created_on> =某个名称列表中找到某个日期和名称的组合的记录。混合ActiveRecord查找条件
对于“> =”我必须使用SQL条件。对于“IN”,我必须使用条件的散列,其中的关键字是:名称,值是名称数组。
有没有办法将两者结合?
我想在created_on> =某个名称列表中找到某个日期和名称的组合的记录。混合ActiveRecord查找条件
对于“> =”我必须使用SQL条件。对于“IN”,我必须使用条件的散列,其中的关键字是:名称,值是名称数组。
有没有办法将两者结合?
您可以使用轨道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拉姆达让您在传递参数
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")
更多关于named_scopes看到Ryan's announcement和Railscast on named_scopes
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。
已经提出的命名范围非常好。该CLASIC的方式做这将是:
names = ["dave", "jerry", "mike"]
date = DateTime.now
Person.find(:all, :conidtions => ["created_at > ? AND name IN ?", date, names])
如果您使用的是旧版本的Rails,洪扎的查询是接近的,但你需要添加括号的是还会放置在IN条件的字符串:
Person.find(:all, :conditions => ["created_at > ? AND name IN (?)", date, names])
使用IN可以是一个混合包:它是整数最快和最慢的字符串列表。如果你发现自己只用一个名字,肯定使用等号操作:
Person.find(:all, :conditions => ["created_at > ? AND name = ?", date, name])
我想我要么会使用简单的AR发现者或Searchgasm。
约named_scopes很酷的事情是,他们在收集工作太:
class Post < ActiveRecord::Base
named_scope :published, :conditions => {:status => 'published'}
end
@post = Post.published
@posts = current_user.posts.published
你可以链where
条款:
Person.where(name: ['foo', 'bar', 'baz']).where('id >= ?', 42).first