2011-11-23 24 views
5

Tôi đang tìm cách thêm một mô hình Favorite vào các mẫu UserLink của mình.Mô hình yêu thích

Business Logic

  • Người dùng có thể có nhiều liên kết (có nghĩa là, họ có thể thêm nhiều liên kết)
  • Người dùng có thể yêu thích nhiều liên kết (riêng hoặc khác người dùng của họ)
  • Một liên kết có thể được nhiều người dùng yêu thích nhưng có một chủ sở hữu

Tôi đang nhầm lẫn về cách mô hình liên kết này và người dùng yêu thích như thế nào b e được tạo ra khi các mô hình được đặt ra?

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 

Trả lời

8

Làm thế nào về mô hình dữ liệu sau đây:

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 

Kể từ User đã có một hiệp hội gọi là links, và Link đã có một gọi users, chúng ta không thể sử dụng tên tương tự cho các hiệp hội has_many :through (ví dụ User has_many :links, :through => :favorites sẽ không hoạt động). Vì vậy, chúng tôi phát minh ra một tên liên kết mới và giúp Rails biết liên kết nào cần tải từ hiệp hội trung gian thông qua thuộc tính source.

Dưới đây là một số giả để sử dụng liên kết này:

# 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

Liệu tôi có cần phải tạo ra 'Favorite_Link' và' mô hình Favorited'? – Dru

+0

Không; 'has_many: through' kết hợp với các tùy chọn' class_name' chỉ ra rằng Rails nên nhìn vào liên kết đã cho một liên kết khác trong đó, về cơ bản nhảy qua hai mô hình để có được các đối tượng thích hợp. –

+0

DISREGARD [Đã giải thích ở trên]: Cảm ơn, tôi đang gặp khó khăn khi hiểu cách chúng tôi có thể tham khảo: yêu thích và: favorites_links trong các mô hình mà không có những mô hình hiện có như chính mô hình. Có tên cho kỹ thuật này không? Tôi muốn đọc nó để hiểu nó hoạt động như thế nào. – Dru

Các vấn đề liên quan