मुझे रेल में पॉलिमॉर्फिक एसोसिएशन के लिए स्कॉप्स लिखने के बारे में बहुत कम पता चला है, अकेले पॉलिमॉर्फिक एसोसिएशन पर प्रश्न कैसे लिखना है।पॉलिमॉर्फिक एसोसिएशन के साथ स्कॉप्स और क्वेरीज़
रेल दस्तावेज़ीकरण में, मैंने Polymorphic Associations section, Joining Tables section, और Scopes section पर देखा है। मैंने गुगलिंग का अपना उचित हिस्सा भी किया है।
उदाहरण के लिए इस स्थापना लें:
class Pet < ActiveRecord::Base
belongs_to :animal, polymorphic: true
end
class Dog < ActiveRecord::Base
has_many :pets, as: :animal
end
class Cat < ActiveRecord::Base
has_many :pets, as: :animal
end
class Bird < ActiveRecord::Base
has_many :pets, as: :animal
end
तो एक Pet
animal_type
"डॉग", "कैट" के हो सकते हैं, या "बर्ड"।
सभी तालिका संरचनाओं दिखाने के लिए: यहाँ मेरी schema.rb है:
create_table "birds", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "cats", force: :cascade do |t|
t.integer "killed_mice"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "dogs", force: :cascade do |t|
t.boolean "sits"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "pets", force: :cascade do |t|
t.string "name"
t.integer "animal_id"
t.string "animal_type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
मैं तो आगे चला गया और कुछ रिकॉर्ड बनाया:
Dog.create(sits: false)
Dog.create(sits: true)
Dog.create(sits: true) #Dog record that will not be tied to a pet
Cat.create(killed_mice: 2)
Cat.create(killed_mice: 15)
Cat.create(killed_mice: 15) #Cat record that will not be tied to a pet
Bird.create
और फिर मैं चला गया और कुछ बनाया pet
रिकॉर्ड:
Pet.create(name: 'dog1', animal_id: 1, animal_type: "Dog")
Pet.create(name: 'dog2', animal_id: 2, animal_type: "Dog")
Pet.create(name: 'cat1', animal_id: 1, animal_type: "Cat")
Pet.create(name: 'cat2', animal_id: 2, animal_type: "Cat")
Pet.create(name: 'bird1', animal_id: 1, animal_type: "Bird")
और वह सेटअप है! अब कठिन हिस्सा: मैं Pet
मॉडल पर कुछ स्कोप बनाना चाहता हूं जो पॉलीमोर्फिक संघों में खोदता है।
यहाँ कुछ स्कोप मैं लिखने के लिए करना चाहते हैं कर रहे हैं:
- मुझे दो सब animal_type == "डॉग" कि बैठ सकते हैं
- मुझे animal_type के सभी
Pets
दें कीPets
== "कैट" जिसने कम से कम 10 चूहों को मार दिया है - मुझे सभी
Pets
दें जो जानवरों के प्रकार "कुत्ते" नहीं हैं और बैठ नहीं सकते हैं।
तो मैं वहाँ में मेरे कार्यक्षेत्र डाल करने के लिए चाहते हो जाएगा मेरी Pet
मॉडल में:
class Pet < ActiveRecord::Base
belongs_to :animal, polymorphic: true
scope :sitting_dogs, -> {#query goes here}
scope :killer_cats, -> {#query goes here}
scope :remove_dogs_that_cannot_sit, -> {#query goes here} #only removes pet records of dogs that cannot sit. All other pet records are returned
end
(दूसरे शब्दों में: कुत्तों के लिए सिवाय इसके कि नहीं बैठ सकते मुझे सभी पालतू जानवरों को दे दो: उन सभी को) मुझे इन क्षेत्रों को लिखना बहुत मुश्किल लगता है।
कुछ चीज़ें जो मुझे ऑनलाइन मिलीं, ऐसा लगता है कि आप केवल इन स्कॉप्स को कच्चे एसक्यूएल के साथ लिख सकते हैं। मैं सोच रहा हूं कि इसके बजाय इन स्कॉप्स के लिए हैश सिंटैक्स का उपयोग करना संभव है या नहीं।
कोई सुझाव/सहायता की सराहना की जाएगी!
'self.remove_dogs_that_cannot_sit' को 'पशु' पर शामिल करने के द्वारा तेज़ी से बनाया जा सकता है। 'All.includes (: पशु) .reject {| pet | pet.animal_type == "कुत्ता" &&! pet.animal.sits} ' – chrismanderson
इसके सूक्ष्म को नोट करें, लेकिन जब आप" .reject "भाग को दबाते हैं तो आप वास्तव में रूबी के लिए छोड़ रहे हैं और एसक्यूएल को पीछे छोड़ रहे हैं, इसलिए इसकी धीमी क्यों है। आप एरियल स्कॉप्स चेन कर सकते हैं और एसक्यूएल में रह सकते हैं, उदा।by_dogs.where (बैठता है: झूठा) बराबर होना चाहिए, मान लें कि आपके पास डीबी में बूलियन कॉलम पर पूर्ण और डिफ़ॉल्ट झूठा सेट नहीं है। आईआईआरसी, मैं गलत हो सकता हूं क्योंकि मैं अपने सिर के ऊपर से जा रहा हूं, लेकिन जब तक आपके पास कोई गुंजाइश है, तब तक ".all" निहित और अनावश्यक है जब आप एरियल स्कॉप्स को चेन कर रहे हैं। – engineerDave