5

मेरे पास एक स्थानीय उपयोगकर्ता मॉडल है जो Activerecord का उपयोग करता है। उपयोगकर्ता के पास एक ईमेल फ़ील्ड है। मेरे पास एक सक्रिय संसाधन मॉडल भी है जिसे कार्यों कहा जाता है जिसमें एक create_by फ़ील्ड है जो सबमिट करने वाले उपयोगकर्ताओं को ईमेल पता संग्रहीत करता है। मैं दोनों को जोड़ना चाहता हूं लेकिन मैं सही वाक्यविन्यास के साथ संघर्ष कर रहा हूं या फिर भी यह संभव है या नहीं।मैं विदेशी कुंजी का उपयोग कर activerecord और activeresource के बीच संबंध कैसे परिभाषित करूं?

ActiveResource की मुख्य शाखा विदेशी कुंजी का समर्थन भी नहीं करती है। मुझे alternative branch मिला लेकिन अभी भी कुछ भी काम नहीं कर सका।

class User < ActiveRecord::Base 
    has_many :tasks 
end 

class Task < ActiveResource::Base 
    belongs_to :user 
    schema do 
    string 'created_by' #email 
    # other fields 
    end 
end 

उत्तर

1

आप नहीं कर सकते, लेकिन आप इसे एक्सेसर विधियों को लागू करके नकली बना सकते हैं।

class User < ActiveRecord::Base 
    #has_many :tasks 
    def tasks 
    Task.find(:all, params: {created_by: email}) 
    end 
end 

class Task < ActiveResource::Base 
    #belongs_to :user 
    def user 
    User.where(email: created_by).first 
    end 

    schema do 
    string 'created_by' #email 
    # other fields 
    end 
end 

यह आप के रूप में करता है, तो अपने वस्तुओं जुड़े थे (अर्थात User.first.tasks.length) कोड बारे में सूचित करेंगे। हालांकि, वे वास्तव में शामिल नहीं हैं। इसका मतलब है कि User.first.tasks डेटाबेस को हिट करने जा रहा है, फिर कार्य को पुनर्प्राप्त करने के लिए एक अतिरिक्त HTTP अनुरोध करें। आपके कोड को कैसे संरचित किया जाता है, इस पर निर्भर करते हुए, आप अप्रत्याशित प्रदर्शन समस्याओं में भाग ले सकते हैं।

इसके अलावा, आप किसी एक क्वेरी एक उपयोगकर्ता और सभी संबद्ध कार्य प्राप्त करने के लिए (क्योंकि यह दो अलग-अलग डेटा भंडार है) नहीं चला सकते हैं, और आप User.joins(:tasks).where({tasks: field_1: true}) तरह फैंसी सामान नहीं कर सकते।

4

आपका कोड काम ठीक दिया जाना चाहिए कि आप Task पर एक user_id विशेषता विदेशी कुंजी के रूप में कार्य करने के लिए, या इस प्रकार आप User मॉडल पर संघ में विदेशी कुंजी निर्दिष्ट कर सकते हैं कि:

class User < ActiveRecord::Base 
    has_many :tasks, foreign_key: "uid" 
end 

अब समस्या यह है कि आप पर ActiveResource पर उपयोग नहीं कर सकते हैं, जब तक आपको Task कक्षा के उदाहरण से user पुनर्प्राप्त करने की आवश्यकता नहीं है, तो आप इसे हटा सकते हैं और संबंध के दूसरी तरफ अभी भी काम करेंगे, हालांकि, यदि आपको आवश्यकता है user पुनर्प्राप्त करें, तो आपको या तो अपना खुद का कार्यान्वयन करना होगा खोजक विधि इस प्रकार है:

class Task < ActiveResource::Base 
    schema do 
    string 'created_by' #email 
    # other fields 
    end 

    def user 
    @user ||= User.find self.user_id # use the attribute name that represents the foreign key 
    end 

    def user=(user) 
    @user = user 
    self.update_attribute(:user_id, user.id) 
    end 
end 

यह मूलतः एक ही व्यवहार करेंगे जैसा कि आप एक ActiveRecord मॉडल पर उम्मीद करेंगे, यदि आप कई संघों है लेकिन इस थकाऊ हो सकता है तो आप के बजाय इस प्रकार belongs_to जोड़ने के लिए ActiveResource मॉड्यूल विस्तार कर सकते हैं :

module BelongsToActiveResource 

    def self.included(base) 
     base.extend(ClassMethods) 
    end 

    module ClassMethods 

    def belongs_to(name, options = {}) 
     class_eval %(
     def #{name} 
      @#{name} ||= name.to_s.classify.find(name.id) 
     end 

     def #{name}=(obj) 
      @#{name} ||= obj 
      self.update_attribute((name.to_s + "_id").to_sym, @#{name}.id 
     end 
    ) 
    end 

    end 

end 

ActiveResource::Base.class_eval { include BelongsToActiveResource } 

यह आपको किसी भी ActiveResource मॉडल पर belong_to का उपयोग करने की अनुमति देगा।

पुनश्च: टास्क के लिए: ऊपर समाधान द्वारा https://stackoverflow.com/a/8844932/3770684

+0

मैं बंदर पैच आप सुझाव के साथ इस की कोशिश की लेकिन जब मैं रन 'User.last.tasks' मैं 'अपरिभाषित विधि 'relation_delegate_class NoMethodError': मिल प्रेरित था क्लास ' – Simmo

+0

रूबी और रेल के कौन से संस्करण आप उपयोग कर रहे हैं? – cousine

+0

रेल 4.1.0 और रूबी 2.1.1 – Simmo

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