我可能会以错误的方式解决这个问题,但在阅读了各种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
)。
最干净的方法是什么?基本上,一旦我将用户限定为给定程序,我该如何干净地访问相关联接表上的字段?
答案 0 :(得分:1)
你在考虑它有点错误:
user.role
由于用户可以在不同的程序中拥有不同的角色,因此会非常模糊。相反,您需要将连接实体视为自己的事物。
最简单的方法是直接选择连接模型:
program = Program.includes(:user_program_records, :users).first
role = program.user_program_records
.find_by(user: program.users.first)
.role
你可以使用关联扩展和辅助方法之类的东西来使它更加性感。