如何区分相似的has_many:通过Rails中的关联?

Posted

技术标签:

【中文标题】如何区分相似的has_many:通过Rails中的关联?【英文标题】:How to differentiate similar has_many :through associations in Rails? 【发布时间】:2021-12-27 23:45:30 【问题描述】:

我将从我的模型开始:

class Project < ApplicationRecord
  has_many :permissions
  has_many :wallets, through: :permissions

  has_many :follows
  has_many :wallets, through: :follows
end

class Permission < ApplicationRecord
  belongs_to :project
  belongs_to :wallet
end

class Follow < ApplicationRecord
  belongs_to :project
  belongs_to :wallet
end

class Wallet < ApplicationRecord
  has_many :permissions
  has_many :projects, through: :permissions

  has_many :follows
  has_many :projects, through: :follows
end

如您所见,Permission 和 Follow 都是通过 Projects 和 Wallet 的关联来实现的。

它们有不同的用途(权限使电子钱包可以访问管理项目,而关注让电子钱包“关注”项目以进行更新)。

那么我该如何区分它们呢?例如,如果我做Wallet.find(1).projects,它默认使用“关注”模型……虽然在某些情况下我希望它实际使用“权限”模型。

【问题讨论】:

附带说明Follow 不是一个好的型号名称。模型代表业务逻辑中的事物,因此它们的名称应该是名词而不是动词。 【参考方案1】:

相信您会发现它将默认为最后定义的has_many :projects

需要给关联起不同的名称,这需要类似 ...

class Wallet < ApplicationRecord
  has_many :permissions
  has_many :projects, through: :permissions

  has_many :follows
  has_many :follow_projects, through: :follows, source: :project
end

【讨论】:

以上是关于如何区分相似的has_many:通过Rails中的关联?的主要内容,如果未能解决你的问题,请参考以下文章

如何将记录添加到has_many:通过rails中的关联

如何在has_many中获取模型的属性:通过Rails 5中的关联

Rails:如何通过 has_many 进行优雅的调用

在has_many中过滤子对象:通过Rails 3中的关系

Rails中如何通过对象同时保存多个has_many?

如何将参数传递给 Rails 4 中的 has_many 关联范围?