अन्य नाम के साथ रेल has_many है


186

मेरे उपयोगकर्ता मॉडल में मैं कर सकता था:

has_many :tasks

और मेरे टास्क मॉडल में:

belongs_to :user

फिर, कार्य तालिका में विदेशी कुंजी 'user_id' को संग्रहीत करते हुए, मैं उपयोग कर सकता था:

@user.tasks

मेरा प्रश्न यह है कि मेरे पास कैसे है_मैं संबंध की घोषणा करता हूं जैसे कि मैं एक उपयोगकर्ता के कार्य का उल्लेख कर सकता हूं:

@user.jobs

... और ...

@user.foobars

एक ढेर धन्यवाद।


7
मैं टास्क एक वर्ग नाम के रूप में उपयोग करने का थके हुए हो जाएगा - यह एक रेल आरक्षित शब्द है और सड़क के नीचे अजीब समस्याओं का कारण बन सकता है: reservedwords.herokuapp.com
— यहोशू पिंटर

जवाबों:


361

इसे एक शॉट दें:

has_many :jobs, foreign_key: "user_id", class_name: "Task"

ध्यान दें, कि बहुरूपी संघों के:as लिए उपयोग किया जाता है ।


1
विदेशी कुंजी को शामिल करने के लिए भी धन्यवाद - मेरी समान लेकिन अलग समस्या को हल किया।
— नील्स एबल्डगार्ड

4
क्या टास्क की तरफ इसको कुछ खास चाहिए या सामान्य belongs_toपर्याप्त है?
— उज्ज्वल-सितारे

1
FYI करें: यह has_and_belongs_to_many संघों के लिए भी काम करता है, केवल "विदेशी_की" कृति की आवश्यकता नहीं है
— डेविड मोरिट्ज़

55

alias_attributeयदि आप अभी भी उन्हें कार्यों के रूप में संदर्भित करना चाहते हैं, तो आप भी उपयोग कर सकते हैं :

class User < ActiveRecord::Base
  alias_attribute :jobs, :tasks

  has_many :tasks
end

3

पूरा करने के लिए @ SamSaffron का जवाब:

आप या class_nameतो के साथ उपयोग कर सकते हैं । मैं व्यक्तिगत रूप से अधिक सार घोषणा पसंद करता हूं, लेकिन यह वास्तव में सिर्फ स्वाद की बात है:foreign_keyinverse_of

class BlogPost
  has_many :images, class_name: "BlogPostImage", inverse_of: :blog_post  
end

और आपको यह सुनिश्चित करने की आवश्यकता है कि आपके पास belongs_toबाल मॉडल पर विशेषता है:

class BlogPostImage
  belongs_to :blog_post
end

0

यदि आप has_many का उपयोग करते हैं, और उपनाम चाहते हैं:

has_many :alias_name, through: model_name, source: initial_name

-61

आप इसे दो अलग-अलग तरीकों से कर सकते हैं। एक "के रूप में" का उपयोग करके है

has_many :tasks, :as => :jobs

या

def jobs
     self.tasks
end

जाहिर है कि पहला सबसे अच्छा तरीका है इसे संभालना।


धन्यवाद, यह बिल्कुल सही लगता है। दुर्भाग्य से यह काम नहीं किया: USER MODEL: has_many: कार्य: as =>: create_tasks CONTROLLER: @created_tasks = @ user.created_tasks ----- NoMethodError in TasksController # index undefined method `create_tasks 'के लिए # <User: 0xb60505
— डॉक्टोरेंज जूल 22'09

4
दूसरी विधि वास्तव में एसोसिएशन का एक उपनाम बनाने के लिए काफी उपयोगी है।
— जेपीजेक

यह उचित प्रतीत नहीं होता है, जैसा कि सैम ने कहा, जैसा कि: बहुरूपी संघों के लिए है।
— माइकल के मेडिसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.