अन्य नाम के साथ रेल 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.