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
您可以使用诸如关联扩展和辅助方法之类的东西来使它更性感。
我可能会以错误的方式解决这个问题,但在阅读了各种 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
您可以使用诸如关联扩展和辅助方法之类的东西来使它更性感。