1

我需要创建一个Friendship (user1_id, user2_id)连接用户的用户模型。

我想避免Friendship为每个用户/朋友创建两条记录,因为友谊是双向的。

你会如何做到这一点,同时有一个有点简单

# User.rb
has_many :friendships
has_many :friends, :through => :friendships, :class_name => "User"

编辑我的解决方案是镜像记录:

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
4

2 回答 2

1

也许这将代码片段将起作用或为您提供一些灵感。它来自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获取所有朋友的内容。

于 2011-10-20T04:58:00.923 回答
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语句明确指定类名,因为它们都指向相同类型的父记录(a User),因此您不能同时调用这两个字段user- 您必须以某种方式区分它们的名称.

于 2011-10-16T04:00:08.280 回答