将关联 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
模型。
如何找到用户角色而不必在给定 Course
和 User
的情况下找到 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
这样一来,在 User
或 Course
上调用方法来获取角色就很明确了,这取决于它们所关联的各自成员资格。
这是一个解决方案,虽然不是最漂亮和最惯用的解决方案
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
我的 Rails 应用程序中有以下模型:
class Course < ActiveRecord::Base
has_many :memberships
has_many :members, through: :memberships, class_name: 'User'
end
虽然 course.members
成功 returns 课程成员,但我无法访问具有 role
属性的 Membership
模型。
如何找到用户角色而不必在给定 Course
和 User
的情况下找到 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
这样一来,在 User
或 Course
上调用方法来获取角色就很明确了,这取决于它们所关联的各自成员资格。
这是一个解决方案,虽然不是最漂亮和最惯用的解决方案
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