【发布时间】:2019-01-10 13:11:39
【问题描述】:
所以我有 User&Role 模型,它使用 has_many 链接到 UserRole 模型:通过关联。我为用户使用序列化程序。注意:用户有很多角色。但由于某种原因,我无法获得序列化程序中的所有角色。这是查询,
unless params['roles'].blank?
render json: User.includes(:roles)
.references(:user_roles)
.where('roles.name IN (?)', params['roles'])
else
render json: User.all
end
在我的用户序列化程序中,我有
attributes :id, :name, :email, :roles
def roles
object.roles.pluck(:name)
end
这件事是,我有一个同时具有“管理员”、“作者”角色的用户。当我将“admin”作为参数传递时,输出 json 对象只有该用户的 roles: ["admin"]。在调试时,对于这个对象,object.roles.count 是 2,但是当我做 object.roles 时,它只显示 1 条记录。发生了什么事?
当我做User.find(object.id).roles.pluck(:name) 时,这有效。但这会在序列化程序循环中运行查询..
对于没有参数的 User.all,输出响应非常好。 (获取角色:[“作者”,“管理员”])。问题是当我传递一个参数时。也许我的查询有问题?
【问题讨论】:
-
.pluck将始终创建数据库查询。这就是它的工作原理。如果要使用加载的记录,请使用object.roles.map(&:name)。 -
还有实际想要的结果是什么的问题。由于
.includes创建了一个外连接,结果将包括连接表中没有任何匹配项的用户(没有任何角色的用户)。如果你想根据角色过滤用户,你需要使用.joins,它会创建一个 LEFT INNER JOIN 或在查询中添加一个having子句。 -
将
.where与.includes结合使用时实际发生的情况是,仅加载与谓词匹配的连接表行。 -
@max 所以我需要所有具有“管理员”角色的用户。或所有具有“管理员”或“作者”角色的用户。
标签: ruby-on-rails relationship has-many-through active-model-serializers