【问题标题】:ActiveRecord, double belongs_toActiveRecord,双重属于_to
【发布时间】:2011-11-07 18:03:52
【问题描述】:

我有 2 个模型:LinkUser 如:

class Link < ActiveRecord::Base
  belongs_to :src_user
  belongs_to :dst_user
end

class User < ActiveRecord::Base
  has_many :links
end

架构可能如下所示:

+----------+     +------+
| Link     |     | User |
+----------+     |------+
| src_user |---->|      |
| dst_user |---->|      |
+----------+     +------+

我的问题是:我如何编辑User 模型才能做到这一点

@user.links # => [list of links]

(...应该查询@user.src_users + @users.dst_users,如果可能的话具有唯一性。)

我们可以只在 ActiveRecord 中使用 SQL 来做到这一点吗? 非常感谢。

(注意:我使用的是 Rails 3.1.1)

【问题讨论】:

  • 这不是默认行为吗? link 关联在 User 中,并将查询 Links 表以查找具有匹配 user_id 值的所有链接。

标签: ruby-on-rails activerecord model


【解决方案1】:

您必须在用户模型中指定多个关系,以便它知道它将附加到哪个特定关联。

class Link < ActiveRecord::Base
  belongs_to :src_user, class_name: 'User'
  belongs_to :dst_user, class_name: 'User'
end

class User < ActiveRecord::Base
  has_many :src_links, class_name: 'Link', inverse_of: :src_user
  has_many :dst_links, class_name: 'Link', inverse_of: :dst_user
end

必须指定 :class_name 选项,因为关联名称不仅仅是 :links。您可能还需要在 Link 模型中指定 :inverse_of 选项,但我不能确定。不过,如果你这样做也不会受到伤害。

为了进行@user.links 调用,您必须执行以下操作:

class User < ActiveRecord::Base
  def links
    Link.where(['src_user = ? OR dst_user = ?', self.id, self.id])
  end
end

……因为 ActiveRecord 没有提供将同一模型上的两个关联合并为一个的方法。

【讨论】:

    【解决方案2】:

    这听起来很像孩子/母亲/父亲的问题,有一个解决方案。也就是一个类型belongs_to的对象多于一个相同类型的对象(不一定和child同类型,但它所属的对象本身是同类型)的问题。

    这个解决方案已经很老了,可能跟 Rails3 中最新的样式方案不同步,但它应该可以正常工作,或者只需要很少的修改。 http://railsforum.com/viewtopic.php?id=1248

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      相关资源
      最近更新 更多