2008-09-17 16 views
8

मैं create_on> = कुछ दिनांक और नामों की सूची में नामों के नाम पर रिकॉर्ड ढूंढना चाहता हूं।मिक्सिंग ActiveRecord को खोजें

"> =" के लिए मुझे एसक्यूएल स्थिति का उपयोग करना होगा। "आईएन" के लिए मुझे उन स्थितियों के हैश का उपयोग करना होगा जहां कुंजी है: नाम और मान नामों की सरणी है।

क्या दोनों को गठबंधन करने का कोई तरीका है?

उत्तर

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 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 

आप अपने दायरों में से किसी एक लैम्ब्डा का उपयोग करने के लिए चर में पारित करने के लिए जा रहे हैं।

0

नामित स्कोप पहले से ही प्रस्तावित हैं। यह करने के लिए क्लासिक तरीका होगा:

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

आप एक पुराने संस्करण रेल का उपयोग कर रहे हैं, तो Honza की क्वेरी करीब है, लेकिन स्ट्रिंग बताता में हालत में रखा जाए के लिए कोष्ठक जोड़ने की जरूरत:

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

आईएन का उपयोग मिश्रित बैग हो सकता है: यह पूर्णांक के लिए सबसे तेज़ है और तारों की सूची के लिए सबसे धीमा है। आप सिर्फ एक ही नाम का उपयोग कर पाते हैं, तो निश्चित रूप से एक ऑपरेटर के बराबर होती है का उपयोग करें:

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

मुझे लगता है कि मैं या तो साधारण एआर ढूँढ़ने वाले या 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

संबंधित मुद्दे