我的Rails应用程序中有以下模型:
class Course < ActiveRecord::Base
has_many :memberships
has_many :members, through: :memberships, class_name: 'User'
end
course.members
成功退回课程成员后,我无法访问具有Membership
属性的role
模型。
如何找到用户角色,而无需找到Membership
和Course
给出的User
?我可以在上下文关联中以某种方式将role
属性注入User
吗?
用户模型:
class User < ActiveRecord::Base
has_many :memberships, dependent: :destroy
has_many :courses, through: :memberships
end
答案 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
这样,明确地调用User
或Course
上的方法来获取角色取决于它们所关联的相应成员资格。