2012-08-07 28 views
5

मेरे पास एक उपयोगकर्ता और कहानी मॉडल हैं जो दोनों की टिप्पणियां हैं।कारखाने की लड़की के साथ पॉलिमॉर्फिक एसोसिएशन को परिभाषित करने के लिए कैसे करें

मैं नीचे के रूप में निम्नलिखित मॉडल की घोषणा की:

class Comment 
    belongs_to :commentable, polymorphic: true 
    belongs_to :user 
end 

class User 
end 

class Story 
end 

अब, मुझे लगता है कि के रूप में सराहनीय और उपयोगकर्ता के रूप में एक ही उपयोगकर्ता के अंतर्गत आता है FactoryGirl के साथ एक टिप्पणी वस्तु घोषित करने के लिए चाहते हैं।

FactoryGirl.define do 
    factory :user do 
    sequence(:email) {|n| "person#{n}@exmaple.com"} 
    sequence(:slug) {|n| "person#{n}"} 
    end 

    factory :comment do  
    occured_at { 5.hours.ago } 
    user 
    association :commentable, factory: :user 
    end 

end 

समस्या यहां है कि उपयोगकर्ता उस टिप्पणी और सराहनीय उपयोगकर्ता लिखना ही नहीं हैं है:

यहाँ मेरी कोड अब तक है।

मुझे इसे ठीक क्यों करना चाहिए?

कई TNX

+0

तुम भी इस सवाल का समाधान यहां पा सकते हैं: http: //स्टैक ओवरफ़्लो।कॉम/प्रश्न/7747945/फैक्ट्रीगर्ल-एंड-पॉलिमॉर्फिक-एसोसिएशन/24228599 # 24228599 –

उत्तर

5

सबसे पहले, मैं तुम्हें काफी किया अपने संघों की स्थापना कर रहे हैं नहीं लगता है ... मैं इस बारे में सोच रहा है कि आप क्या चाहते:

class Comment < AR 
    belongs_to :commentable, polymorphic: true 
end 

class User < AR 
    has_many :comments, as: :commentable 
end 

class Story < AR 
    has_many :comments, as: :commentable 
end 

देखें: http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

डीबी सेटअप को न भूलें।

दूसरा, फैक्टरी सेटअप दो उपयोगकर्ताओं को वापस कर रहा है क्योंकि आप इसे कह रहे हैं। आज़माएं:

FactoryGirl.define do 
    factory :user do 
    sequence(:email) {|n| "person#{n}@exmaple.com"} 
    sequence(:slug) {|n| "person#{n}"} 
    end 

    factory :comment do  
    occured_at { 5.hours.ago } 
    association :commentable, factory: :user 
    end 

end 

शैली के मामले में, मॉडल नामों की पसंद यहां थोड़ा उलझन में है। उपयोगकर्ता "टिप्पणी करने योग्य" कैसे है? यदि आपका मतलब किसी अन्य प्रकार का लेखन है, तो मैं एक अलग नाम चुनूंगा। यदि आप का मतलब है "उपयोगकर्ता प्रोफ़ाइल" या उन पंक्तियों के साथ कुछ।

+0

ठीक है, लेकिन मुद्दा यह है कि, मैं एक उपयोगकर्ता ऑब्जेक्ट को दो से संबद्ध कैसे जोड़ता हूं? मैं टिप्पणी वर्ग में उपयोगकर्ता विशेषता में वही सराहनीय उपयोगकर्ता जोड़ना चाहता हूं। – gilsilas

0

मैं इस प्रश्न पर आया क्योंकि मेरे पास व्यक्तिगत रूप से समान था और इसे हल किया गया था। @jordanpg की तरह, मैं उत्सुक हूं कि उपयोगकर्ता कैसे टिप्पणी योग्य है। मैं सही ढंग से समझ रहा हूँ, तो समस्या उपयोगकर्ता के लिए जो कहानी और उपयोगकर्ता के लिए जो कहानी पर टिप्पणी लिखी लिखा विभिन्न उपयोगकर्ताओं हो सकता है:

  • USER_1 एक कहानी
  • user_2 (या किसी भी उपयोगकर्ता) लिखते हैं USER_1 की कहानी

ऐसा करने में पर टिप्पणी कर सकते, मैं मॉडल संघों इस तरह सेट करेंगे:

# app/models/user.rb 
class User < ApplicationRecord 
    has_many :stories 
    has_many :comments 
end 

# app/models/story.rb 
class Story < ApplicationRecord 
    belongs_to :user 
    has_many :comments, as: :commentable 
end 

# app/models/comment.rb 
class Comment < ApplicationRecord 
    belongs_to :user 
    belongs_to :commentable, polymorphic: true 
end 

और फिर मेरे कारखाने में, यह इस प्रकार दिखाई देगा : क्यों यह काम करता है की

# spec/factories.rb 
FactoryBot.define do 

    factory :user do 
    sequence(:email) {|n| "person#{n}@exmaple.com"} 
    sequence(:slug) {|n| "person#{n}"} 
    end 

    factory :post do 
    body "this is the post body" 
    user 
    end 

    factory :comment do 
    body "this is a comment on a post" 
    user 
    association :commentable, factory: :post 
    end 
end 

भाग है, क्योंकि factory_bot स्वचालित रूप से किसी भी बच्चे को आप बना रहे हैं की मूल का निर्माण करेगा। संघों पर उनके डॉक्स काफ़ी अच्छा कर रहे हैं: http://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md#Associations

आप उन की जरूरत है टिप्पणियों पर टिप्पणी करने में सक्षम हो, तो आप इसे इस तरह से कर सकता है:

factory :comment_on_post, class: Comment do 
    body "this is a comment on a post" 
    user 
    association :commentable, factory: :post 
    end 

    factory :comment_on_comment, class: Comment do 
    body "this is a comment on a comment" 
    user 
    association :commentable, factory: :comment_on_post 
    end 
संबंधित मुद्दे