ruby-on-rails - 双向自引用关联

标签 ruby-on-rails bidirectional self-reference

以 Ryan Bates 的 asciicast 为例:
http://asciicasts.com/episodes/163-self-referential-association

他以 User 的两个关联结束

  • : friend
  • :inverse_friends

  • 考虑到用户不关心谁挑起友谊,你会想要一个简单的用户关联
  • : friend

  • 这包括两种关系。即由用户发起的关系和由用户的 friend 发起的关系。

    那么如何实现这种双向自引用关联呢?

    更新 - Josh Susser 在这里发表了一篇关于此的帖子:
    http://blog.hasmanythrough.com/2006/4/21/self-referential-through

    然而,它仍然谈论 has_many :sources 和 has_many :sinks,而实际上应该有一个包含源和接收器的 has_many :nodes。

    最佳答案

    看看这对你有用吗?

    class User < ActiveRecord::Base
      has_many :friendships, :foreign_key => "person_id", :class_name => "Friendship"
      has_many :friends, :through => :friendships
    
      def befriend(user)
        # TODO: put in check that association does not exist
        self.friends << user
        user.friends << self
      end
    end
    
    class Friendship < ActiveRecord::Base
      belongs_to :person, :foreign_key => "person_id", :class_name => "User"
      belongs_to :friend, :foreign_key => "friend_id", :class_name => "User"  
    end
    
    # Usage
    jack = User.find_by_first_name("Jack")
    jill = User.find_by_first_name("Jill")
    
    jack.befriend(jill)
    
    jack.friends.each do |friend|
      puts friend.first_name
    end
    # => Jill
    
    jill.friends.each do |friend|
      puts friend.first_name
    end
    # => Jack
    

    这是给定的数据库表模式
    users
      - id
      - first_name
      - etc...
    
    friendships
      - id
      - person_id
      - friend_id
    

    关于ruby-on-rails - 双向自引用关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2923692/

    相关文章:

    design-patterns - 组件和复合之间具有双向关联的复合模式

    sql - SQL 中的自引用 CASE WHEN 子句

    machine-learning - Prolog 中可以进行自适应解析吗?

    ruby-on-rails - Rails 4 如何覆盖设计响应路径出错

    ruby-on-rails - Rails 3 has_many :through naming issue

    ruby-on-rails - Rails 在 url 中使用 '.' 截断参数

    python - 使用图像模块(python)将希伯来语文本绘制到图像

    ruby-on-rails - 如何从 Ruby 1.8.7 中的 utf-8 字符串中获取第 i 个字符?

    c# - Python 和 C# 之间的 IPC

    entity-framework - Entity Framework 4.1代码优先自引用一对多和多对多关联