2008-09-17 116 views
8

我想在created_on> =某個名稱列表中找到某個日期和名稱的組合的記錄。混合ActiveRecord查找條件

對於「> =」我必須使用SQL條件。對於「IN」,我必須使用條件的散列,其中的關鍵字是:名稱,值是名稱數組。

有沒有辦法將兩者結合?

回答

26

您可以使用軌道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") 
1

更多關於named_scopes看到Ryan's announcementRailscast 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。

0

已經提出的命名範圍非常好。該CLASIC的方式做這將是:

names = ["dave", "jerry", "mike"] 
date = DateTime.now 
Person.find(:all, :conidtions => ["created_at > ? AND name IN ?", date, names]) 
7

如果您使用的是舊版本的Rails,洪扎的查詢是接近的,但你需要添加括號的是還會放置在IN條件的字符串:

Person.find(:all, :conditions => ["created_at > ? AND name IN (?)", date, names]) 

使用IN可以是一個混合包:它是整數最快和最慢的字符串列表。如果你發現自己只用一個名字,肯定使用等號操作:

Person.find(:all, :conditions => ["created_at > ? AND name = ?", date, name]) 
0

我想我要麼會使用簡單的AR發現者或Searchgasm

2

約named_scopes很酷的事情是,他們在收集工作太:

class Post < ActiveRecord::Base 
    named_scope :published, :conditions => {:status => 'published'} 
end 

@post = Post.published 

@posts = current_user.posts.published 
1

你可以鏈where條款:

Person.where(name: ['foo', 'bar', 'baz']).where('id >= ?', 42).first