从关联表中将属性注入关联记录?

时间:2015-07-08 20:14:36

标签: ruby-on-rails ruby ruby-on-rails-4 associations

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

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

course.members成功退回课程成员后,我无法访问具有Membership属性的role模型。

如何找到用户角色,而无需找到MembershipCourse给出的User?我可以在上下文关联中以某种方式将role属性注入User吗?

用户模型:

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

3 个答案:

答案 0 :(得分:1)

这是一个解决方案,但不是最美丽和惯用的

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

答案 1 :(得分:0)

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

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"

答案 2 :(得分:0)

我认为根据使用的role动态存储上下文Course并不是一个好主意。我感觉很讨厌,因为属性值是隐式设置而不是显式执行。 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上的方法来获取角色取决于它们所关联的相应成员资格。