2009-07-01 21 views
6

Đây là một sự tiếp nối của câu hỏi này: Original Question (SO)Rails - hai chiều mô hình "tình bạn" (tiếp theo)

Câu trả lời cho câu hỏi này liên quan đến các thiết lập sau đây của các mô hình:

class User < ActiveRecord::Base 
    has_many :friendships 
    has_many :friends, :through => :friendships #... 
end 

class Friendship < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend, :class_name => 'User', :foreign_key => 'friend_id' 
end 

<% for friendship in @user.friendships %> 
    <%= friendship.status %> 
    <%= friendship.friend.firstname %> 
<% end %> 

Điều này làm việc tốt nếu nói, tôi có một người sử dụng và tôi muốn nhận được tất cả các "tình bạn" mà id của mình là: user_id FK trên mô hình Friendship. NHƯNG, khi tôi chạy một cái gì đó giống như

@user.friendships.friends 

Tôi muốn nó trả lại toàn bộ hồ sơ tài mà User có thể là từ: người dùng hoặc: người bạn ở quan hệ hữu nghị - vì vậy, nói cách khác, trả lại tất cả tình bạn trong mà người dùng đó tham gia.

Hy vọng rằng điều trên có ý nghĩa. Tôi vẫn còn khá mới để rails và hy vọng có một cách để làm điều này một cách tao nhã mà không cần chỉ là một bảng liên kết tiêu chuẩn hoặc cung cấp SQL tùy chỉnh.

Cảm ơn bạn!

Tom

+0

Có một câu hỏi tương tự với câu trả lời hay được tìm thấy tại đây: [bảng liên kết có khóa ngoài] (http://stackoverflow.com/questions/623909/rails-model-with-foreignkey-and-link-table/623956#624261) – Tilendor

Trả lời

3

Bạn không thể chỉ sử dụng @ user.friendships ở đây vì nó sẽ chỉ cung cấp cho bạn những tình bạn nơi @ friendship.user_id == @ user.id. Điều duy nhất tôi có thể nghĩ đến ngay lúc này chỉ là để làm

Friendship.find_by_user_id(@user.id).concat Friendship.find_by_friend_id(@user.id) 
1

Từ liên kết railscast:

# models/user.rb 
has_many :friendships 
has_many :friends, :through => :friendships 
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id" 
has_many :inverse_friends, :through => :inverse_friendships, :source => :user 
2

giải pháp của tôi là aa phạm vi:

# model 
class Message < ActiveRecord::Base 
    belongs_to :sender, :class_name => "User" 
    belongs_to :recipient, :class_name => "User" 

    scope :of_user, lambda { |user_id| where("sender_id = ? or recipient_id = ?", 
     user_id, user_id) } 
end 


# in controller 
@messages = Message.of_user(current_user) 
+0

Điều đó có hiệu quả đối với tôi. Đơn giản và hiệu quả. Cảm ơn! – Myxtic

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