2013-04-20 8 views
22

रेल पर रूबी में, मैं शहर में नियोक्ता ढूंढना चाहता हूं। कहना मॉडल इस तरह से स्थापित कर रहे हैं देता है:रेल एसोसिएशन के माध्यम से जुड़ती है

City 
has_many :suburbs 
has_many :households, :through => suburbs 
has_many :people, :through => suburbs 

Suburb 
has_many :households 
has_many people, :through => households 
belongs_to :city 


Household 
has_many :people 
belongs_to :suburb 

People 
belongs_to :household 
belongs_to :employer 


Employer 
has_many :people 

मुझे लगता है कि मैं चाहता हूँ नियोक्ता किसी प्रकार का some_city.people मिलती है, लेकिन मैं ऐसा करने के तरीके पता नहीं है। अगर लोग सीधे शहरों से संबंधित थे, तो मैं उन लोगों के लिए नियोक्ता से जुड़ सकता हूं जहां शहर_आईडी कुछ है, लेकिन मैं उस प्रत्यक्ष डेटा के बिना वही डेटा ढूंढना चाहता हूं और मैं थोड़ा खो गया हूं।

धन्यवाद।

+0

आप रेल में ऐसा करने की कोशिश कर रहे हैं? क्यों न केवल अपने सहायक तरीकों का उपयोग करें? – Steve

+0

मुझे खेद है, आप इसके लिए किस सहायक विधि की सिफारिश करेंगे? – spitfire109

+0

आप 'नियोक्ता' से 'है_मनी: थ्रू' के माध्यम से रिश्तों को क्यों नहीं पार करते हैं जैसे आप 'सिटी' से कर रहे हैं? –

उत्तर

15

का उपयोग आप jvans की तरह शामिल हो सचित्र है क्या कर सकते हैं होगा।

class Employer < ActiveRecord::Base 
    has_many :people 
    has_many :households, through: :people 
    has_many :suburbs, through: :households 
    has_many :cities, through: :suburbs 
end 

class Person < ActiveRecord::Base 
    belongs_to :household 
    belongs_to :employer 
end 


class Household < ActiveRecord::Base 
    belongs_to :suburb 
    has_many :people 
end 

class Suburb < ActiveRecord::Base 
    belongs_to :city 
    has_many :households 
    has_many :people, through: :households 
end 

class City < ActiveRecord::Base 
    has_many :suburbs 
    has_many :households, through: :suburbs 
    has_many :people, through: :households 
    has_many :employers, through: :people 
end 

तो फिर तुम Employer से City, और उपाध्यक्ष प्रतिकूल, सीधे शामिल हो सकते हैं: या तो आप सेटअप निम्नलिखित की तरह अपने रिश्तों कर सकते हैं।

उदाहरण के लिए:

Employer.joins(:cities).where("cities.name = ?", "Houston").first 

SELECT "employers".* FROM "employers" 
INNER JOIN "people" ON "people"."employer_id" = "employers"."id" 
INNER JOIN "households" ON "households"."id" = "people"."household_id" 
INNER JOIN "suburbs" ON "suburbs"."id" = "households"."suburb_id" 
INNER JOIN "cities" ON "cities"."id" = "suburbs"."city_id" WHERE (cities.name = 'Houston') 
LIMIT 1 
+0

वाह। मैं पूरी तरह से अनजान था कि मैं उस तरह का संघ बना सकता हूं। मैं इसे लागू करता हूं, मुझे संदेह है कि यह वही जवाब है जो मैं भविष्य के समान प्रश्नों और सामानों को काम करने के लिए देख रहा हूं। – spitfire109

+0

हाँ, रेल 3.1 के रूप में, नेस्टेड 'has_many: संबंधों के माध्यम से काफी अच्छी तरह से काम करते हैं। –

31

नेस्ट उपयोग

Employer.joins({:people => {:household => {:suburb => :city}}}) 

के जुड़ने पर आपको में शामिल होने तालिका आप देख रहे हैं देना चाहिए। आप दूसरी दिशा से गुजरने रहे थे, तो आप बहुवचन नाम

City.joins(:suburbs => {:households => {:people => :employers }}) 
+0

ठीक है मुझे लगता है कि मैं यही पूछ रहा था। सिंटैक्स को साफ़ करने के लिए, किसी विशेष शहर की पहचान करने के लिए अंतिम सहयोग कैसे बनाया जाएगा? मान लीजिए कि मैं उन सभी नियोक्ताओं को ढूंढना चाहता हूं जो शिकागो के लोगों को रोजगार देते हैं, जिनमें 1 का मॉडल आईडी है? – spitfire109

+1

इसे कहां से क्लॉज जोड़ें। ("नियोक्ता.city IN? और नियोक्ता। आईडी में?, शहर, आईडी) – jvans

+1

इसके अलावा मैं सक्रिय रिकॉर्ड 3 के साथ काम करने के लिए सर्चलॉग नामक एक मणि को फिर से लिख रहा हूं और जल्द ही किया जाना चाहिए। यह आपके ऐप में बहुत ही कम खोज करता है। Https://github.com/binarylogic/searchlogic?source=cr – jvans

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