2008-09-17 18 views
8

Kayıtlı_on> = bir tarih ve adların bazı adlarında IN kombinasyonunun kayıtlarını bulmak istiyorum.Karıştırma ActiveRecord koşullarını bul

"> =" sql koşulunu kullanmak zorundayım. "IN" için, anahtarın bulunduğu bir karma koşulu kullanmam gerekirdi: isim ve değer, ad dizisidir.

İkisini birleştirmenin bir yolu var mı?

cevap

26

Daha sonra

Test.created_after_2005.named_fred 

yapabilirsiniz raylar 2.1 ve

Class Test < ActiveRecord::Base 
    named_scope :created_after_2005, :conditions => "created_on > 2005-01-01" 
    named_scope :named_fred, :conditions => { :name => "fred"} 
end 

yukarıda adı kapsamları kullanabilirsiniz Yoksa argümanlardaki geçmesine izin veren bir lambda named_scope verebilir

Class Test < ActiveRecord::Base 
    named_scope :created_after, lambda { |date| {:conditions => ["created_on > ?", date]} } 
    named_scope :named, lambda { |name| {:conditions => {:name => name}} } 
end 

sonra

yapabilirsiniz Eğer bir lambda kullanmak zorunda senin kapsamları için değişkenlerde geçmek yapacaksanız named_scopes hakkında daha fazlası için
Test.created_after(Time.now-1.year).named("fred") 
1

Ryan's announcement görmek ve 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 

.

0

Zaten önerilen adlandırılmış kapsamlar oldukça iyi. bunu yapmak için klasik bir yol olacağını:

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

eski bir sürümünü Rails kullanıyorsanız, HONZA sorgusu yakın olmakla birlikte, IN durumda yerleştirilecek dizeleri parantez eklemeniz gerekir:

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

IN kullanımı karışık bir torba olabilir: tamsayılar için en hızlıdır ve dizeler listesi için en yavaş olanıdır. Eğer sadece bir isim kullanarak kendiniz bulursanız, kesinlikle bir operatör eşittir kullanın:

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

Ben de basit AR bulucuları veya Searchgasm kullanmak için gidiyorum düşünüyorum.

2

named_scopes hakkında serin şey onların da koleksiyonlarına üzerinde çalışmak şudur:

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

@post = Post.published 

@posts = current_user.posts.published 
1

yapabilirsiniz zincir where fıkra:

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