我需要创建一个连接用户的用户Friendship (user1_id, user2_id)
模型。
我希望避免为每个用户/朋友创建两条Friendship
记录,因为友谊是双向的。
如果有一个简单的
,你会怎么做呢?# User.rb
has_many :friendships
has_many :friends, :through => :friendships, :class_name => "User"
EDIT 我的解决方案是反映记录:
class Friendship < ActiveRecord::Base
belongs_to :user1
belongs_to :user2
after_create :create_mirror!
after_destroy :destroy_mirror!
validate :does_not_exist
def mirror_record
Friendship.where(:user1_id => user2.id, :user2_id => user1.id).first
end
private
def does_not_exist
errors.add(:base, 'already exists') if Friendship.where(:user1_id => user1.id, :user2_id => user2.id) rescue nil
end
def create_mirror!
Friendship.create(:user1 => user2, :user2 => user1)
end
def destroy_mirror!
mirror_record.destroy if mirror_record
end
end
答案 0 :(得分:0)
每个友谊你应该只需要一条记录。 Friendship
类只有两个属性,每个属性都指向一个朋友。
class Friendship
belongs_to user1, :class_name => "User"
belongs_to user2, :class_name => "User"
......你的桌子是......
friendship_id | user1_id | user2_id
-----------------------------------
在Rails 2.x中,这被称为“拥有并且属于许多”关系(HABTM)。
我认为你必须明确指定每个belongs_to
语句的类名,因为它们都指向相同类型的父记录(User
),因此你可以' t调用两个字段user
- 你必须以某种方式区分它们。
答案 1 :(得分:0)
也许这会使代码片段起作用或为您提供一些灵感。它来自amistad宝石。
class User
has_many :friendships
has_many :invited, :through => :friendships, :source => :friend
has_many :invited_by, :through => :inverse_friendships, :source => :user
def friends
self.invited + self.invited_by
end
class Friendships
belongs_to :user
belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
因此,在您的控制器中,您可以编写类似user.friends
的内容来获取所有朋友。