2011-11-23 19 views
5

मैं अपने User और Link मॉडल पर Favorite मॉडल जोड़ने के लिए देख रहा हूं।मॉडलिंग पसंदीदा

व्यापार तर्क

  • उपयोगकर्ता एकाधिक लिंक (अर्थात, वे अनेक लिंक जोड़ने) हो सकता है
  • उपयोगकर्ता कर सकते हैं (अपने स्वयं के या अन्य उपयोगकर्ताओं की) पसंदीदा एकाधिक लिंक
  • एक लिंक एकाधिक उपयोगकर्ताओं द्वारा अनुकूल किया जा सकता है लेकिन एक मालिक

मैं इस संगठन को मॉडल करने के तरीके के बारे में उलझन में हूं और उपयोगकर्ता पसंदीदा बी कैसे होगा मॉडलों के स्थान पर एक बार बनाया गया है?

class User < ActiveRecord::Base 
    has_many :links 
    has_many :favorites 
end 

class Link < ActiveRecord::Base 
    belongs_to :user 
    #can be favorited by multiple users 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :link 
end 

उत्तर

8

कैसे निम्न डेटा मॉडल के बारे में:

class User < ActiveRecord::Base 
    has_many :links 
    has_many :favorites, :dependent => :destroy 
    has_many :favorite_links, :through => :favorites, :source => :link 
end 

class Link < ActiveRecord::Base 
    belongs_to :user 
    has_many :favorites, :dependent => :destroy 
    has_many :favorited, :through => :favorites, :source => :user 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :link 
end 

User के बाद से पहले से ही एक संघ links कहा जाता है, और Link पहले से ही एक users कहा जाता है, हम has_many :through संघ के लिए एक ही नाम का उपयोग नहीं कर सकते हैं (उदाहरण के लिए User has_many :links, :through => :favorites काम नहीं करेगा)। इसलिए, हमने एक नया एसोसिएशन नाम आविष्कार किया है, और रेल को यह जानने में मदद करता है कि source विशेषता के माध्यम से मध्यस्थ संगठन से कौन सा सहयोग लोड करना है।

# Some users 
user1 = User.create :name => "User1" 
user2 = User.create :name => "User2" 

# They create some links 
link1_1 = user1.links.create :url => "http://link1_1" 
link1_2 = user1.links.create :url => "http://link1_2" 
link2_1 = user2.links.create :url => "http://link2_1" 
link2_2 = user2.links.create :url => "http://link2_2" 

# User1 favorites User2's first link 
user1.favorites.create :link => link2_1 
# User2 favorites both of User1's links 
user2.favorites.create :link => link1_1 
user2.favorites.create :link => link1_2 

user1.links   => [link1_1, link1_2] 
user1.favorite_links => [link2_1] 
user2.links   => [link2_1, link2_2] 
user2.favorite_links => [link1_1, link1_2] 
link1_1.favorited => [user2] 

link2_1.destroy 

user1.favorite_links => [] 
user2.links   => [link2_2] 
+0

मैं 'Favorite_Link' और' Favorited' मॉडल बनाने के लिए की जरूरत है चाहेंगे:

यहाँ इस संघ को उपयोग करने के स्यूडोकोड है? – Dru

+0

नहीं; 'has_many:' class_name' विकल्पों के साथ संयुक्त 'इंगित करता है कि रेल को वहां किसी अन्य संगठन के लिए दिए गए एसोसिएशन में देखना चाहिए, अनिवार्य रूप से सही वस्तुओं को प्राप्त करने के लिए दो मॉडल के माध्यम से कूदना चाहिए। –

+0

डिस्ग्रर्ड [ऊपर समझाया गया]: धन्यवाद, मुझे यह समझने में परेशानी हो रही है कि हम कैसे संदर्भ दे सकते हैं: पसंदीदा और मॉडल में पसंदीदा_लिंक्स मॉडल के रूप में मौजूद हैं। क्या इस तकनीक के लिए कोई नाम है? मैं यह समझने के लिए पढ़ना चाहता हूं कि यह कैसे काम करता है। – Dru

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