Rails 通过关系加入 has_many 中实体的字段

Rails field on join entity in has_many through relationship

我可能会以错误的方式解决这个问题,但在阅读了各种 SO 文章和 Rails 关于关联和范围的文档之后,我并没有变得更聪明。

我有一个多对五的关系,如下所示:

class User < ActiveRecord::Base
  has_many :user_program_records
  has_many :programs, through: :user_program_records
end

class Program < ActiveRecord::Base
  has_many :user_program_records
  has_many :users, through: :user_program_records
end

class UserProgramRecord < ActiveRecord::Base
  belongs_to :user
  belongs_to :program

  # has a field "role"
end

思路是系统用户多,程序多。程序中有很多用户,用户可能属于多个程序。然而 - 在一个给定的程序中,一个用户只能有一个角色。

我真正希望能够写的是:

Program.first.users.first.role

并让 return 我担任角色(这只是一个 String)。

最简洁的方法是什么?基本上,一旦我将用户限定为给定程序,我如何干净地访问相关连接上的字段 table?

你考虑的有点不对:

user.role

会非常模糊,因为用户在不同的程序中可以有不同的角色。相反,您需要将连接实体视为独立的事物。

最简单的方法是select直接加入模型:

program = Program.includes(:user_program_records, :users).first
role = program.user_program_records
                .find_by(user: program.users.first)
                .role

您可以使用诸如关联扩展和辅助方法之类的东西来使它更性感。