如何构建rails用户友谊模型?

时间:2011-10-16 01:50:59

标签: ruby-on-rails activerecord ruby-on-rails-3.1 rails-models

我需要创建一个连接用户的用户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

2 个答案:

答案 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的内容来获取所有朋友。