我想在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