2008-09-17 45 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