2012-12-19 17 views
12

तो बुनियादी तौर पर मैं हो, तो कुछ सामान्य दृष्टिकोण खुद संघ प्रकार को परिभाषित करने के लिए जानना चाहते हैं। कुछ विवरण:कस्टम रेल has_many संघ (पृष्ठ सरणी के माध्यम से)

मेरे पास एक मॉडल conversations है जिसमें एक पीजी सरणी कॉलम user_ids है। select conversations.* from conversations where USER_ID = ANY(conversations.user_ids)

finder_sql के बाद से और यह के दोस्तों अब पदावनत कर रहे हैं, मैं सच में पता है कि यह छद्म has_many संघ लागू करने के लिए सबसे अच्छा तरीका होगा चाहते हैं: तो, उपयोगकर्ता बातचीत को पुनः प्राप्त करने मैं चलाने के लिए की आवश्यकता है?

def conversations 
    Conversation.where("#{id} = ANY (conversations.users)") 
end 
तो बुनियादी तौर पर मैं अपने खुद के ActiveRecord::Associations::CollectionAssociation को लागू करने की सोच रहा हूँ और पता करने के लिए अगर वहाँ कुछ अच्छी संदर्भ कर रहे हैं चाहते हैं या यदि आप सलाह सकता है जहां शुरू करने के लिए

:

वर्तमान में मैं सिर्फ तरह तरीकों का उपयोग

Conversation.user.select{ |conversation| conversation.user_ids.include?(params[:id]) 

कोन:


+0

क्या आपके पास स्कीमा पर कोई नियंत्रण है? मैं पूछता हूं क्योंकि विदेशी कुंजियों को पकड़ने के लिए एक सरणी का उपयोग करना बुरा अभ्यास है, न केवल उन परेशानियों के कारण जो आपको अब पैदा कर रहा है। _only_ बार आपको किसी सरणी का उपयोग करने पर विचार करना चाहिए, जब इसे डेटाबेस द्वारा हमेशा एक अविभाज्य चीज़ के रूप में माना जा सकता है जिसका अर्थ नहीं है। –

+3

सही, मैंने शैक्षणिक उद्देश्यों के लिए इस दृष्टिकोण के साथ जाने का फैसला किया। इसके अलावा, मैं सरणी प्रदर्शन के साथ बिल्कुल आश्चर्यचकित हूं। एक और चीज जो मुझे विश्वास दिलाती थी वह यह थी: http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/, जिसने मुझे लगता है कि यह –

+0

के बाद इतना बुरा विचार नहीं है आप ARRAY के साथ जाने का फैसला कर सकते हैं शायद आप SQL व्यू के साथ भी जा सकते हैं? https://github.com/thoughtbot/scenic और मूल रूप से एक और तालिका बनाएं जो आपके सरणी को कुछ इस तरह से denormalizes: (conversation_id, user_id) (कई-कई) ताकि आप सामान्य रूप से कई संबंधों का उपयोग कर सकें। –

उत्तर

0

कैसे के बारे में पर यह बताते हुए कि user_ids कॉलम को क्रमबद्ध किया गया है और वर्तमान उपयोगकर्ता आईडी पैराम्स द्वारा पारित किया गया है [: id]

मुख्य दृष्टिकोण यह है कि, यदि आपके पास कोई सरणी है तो आप जांच सकते हैं कि इसमें 'कुछ' है जिसमें शामिल है। शामिल है? (कुछ) तरीका। इस तरह से सोचते हुए, आप वास्तव में ऑब्जेक्ट्स (उपयोगकर्ताओं, इस मामले में) का चयन करने के लिए चुनिंदा विधि का उपयोग कर सकते हैं जिनके पास इस सरणी के अंदर आईडी शामिल हैं। क्या मैं स्पष्ट हूं?

मुझे बताओ अगर यह काम किया ...

0

मुझे लगता है कि आप मूल रूप से सिर्फ एक संबंध में विधि कोड डाल सकते हैं:

has_many :conversations, ->(user) { where("#{user.id} = ANY (conversations.users)") } 

यह अंत में एक ही किसी भी तरह से, हालांकि होना चाहिए। आपकी विधि एक रिलेशनशिप देता है जिस पर आप चेन कर सकते हैं। एक और विकल्प कुछ ऐसा हो सकता है:

has_many :conversations, -> { where('users.id IN conversations.users') } 

कुछ परेशानियों की आवश्यकता हो सकती है। क्या कोई कारण है कि आप एक नई जॉइन टेबल नहीं जोड़ सकते हैं, यद्यपि? आदर्श इसे conversations_users तालिका में माइग्रेट करना होगा। फिर आप तालिका में स्पष्ट रूप से शामिल हो सकते हैं और विदेशी कुंजी बाधाओं का लाभ उठा सकते हैं।

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