将关联 table 中的属性注入关联记录?

Inject attribute from association table into the associated record?

我的 Rails 应用程序中有以下模型:

class Course < ActiveRecord::Base
  has_many :memberships
  has_many :members, through: :memberships, class_name: 'User'
end

虽然 course.members 成功 returns 课程成员,但我无法访问具有 role 属性的 Membership 模型。

如何找到用户角色而不必在给定 CourseUser 的情况下找到 Membership?我可以在上下文关联中以某种方式将 role 属性注入 User 吗?

用户模型:

class User < ActiveRecord::Base
  has_many :memberships, dependent: :destroy
  has_many :courses, through: :memberships
end

我遇到了完全相同的问题,并且在没有明确找到它的情况下找不到任何方法来获取中间关联。不过也没那么丑:

class User < ActiveRecord::Base
  has_many :memberships, dependent: :destroy
  has_many :courses, through: :memberships

  def role_in(course)
    memberships.find_by!(course: course).role
  end
end

user.role_in(course)
# => "teacher"

我认为根据使用的 Course 动态存储上下文 role 不是一个好主意。这对我来说感觉很老套,因为属性值是隐式设置的,而不是通过显式执行设置的。尽管代表数据库中的一行,User 会根据实例化的位置和方式显示不同。

我会改为执行如下所示的内容:

class User
  def course_role(course)
    memberships.find_by_course(course).role
  end
end

class Course
  def user_role(user)
    members.find_by_user(user).role
  end
end

这样一来,在 UserCourse 上调用方法来获取角色就很明确了,这取决于它们所关联的各自成员资格。

这是一个解决方案,虽然不是最漂亮和最惯用的解决方案

class Course < ActiveRecord::Base
  has_many :memberships

  def members
    User.joins(:memberships).where(id: memberships.ids).select('users.*, memberships.role')
  end
end

更好的方法,通过评论建议:

has_many :members, -> { select('users.*, memberships.role') }, class_name: 'User', through: :memberships, source: :user