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

时间:2016-03-05 01:05:50

标签: ruby-on-rails has-many-through

我可能会以错误的方式解决这个问题,但在阅读了各种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

并让我返回角色(这只是String)。

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

1 个答案:

答案 0 :(得分:1)

你在考虑它有点错误:

user.role

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

最简单的方法是直接选择连接模型:

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

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