首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rollify Gem用户has_many投票/角色,Poll有许多答案,只有一个管理员

Rollify Gem用户has_many投票/角色,Poll有许多答案,只有一个管理员
EN

Stack Overflow用户
提问于 2022-04-23 00:29:49
回答 1查看 41关注 0票数 0

试图创建一个带有用户has_many投票/角色的投票应用程序,但是poll有很多答案,只有一个管理员。

user.rb

代码语言:javascript
运行
复制
class User < ApplicationRecord
  rolify
  has_many :polls, dependent: :destroy, through: :roles, source: :resource, source_type: :Poll
end

poll.rb

代码语言:javascript
运行
复制
class Poll < ApplicationRecord
  resourcify

  # has_many :users, through: :roles, class_name: 'User', source: :users
  has_many :answerers, -> { where(:roles => {name: ::answerers}) }, through: :roles, class_name: 'User', source: :users
  belongs_to :admin, -> { where(:roles => {name: :admin}) }, through: :roles, class_name: 'User', source: :users
end

继续运行以下错误:

代码语言:javascript
运行
复制
Unknown key: :through. Valid keys are: :class_name, :anonymous_class, :primary_key, :foreign_key, :dependent, :validate, :inverse_of, :strict_loading, :autosave, :required, :touch, :polymorphic, :counter_cache, :optional, :default

这个错误是由poll.rb中的这一行引起的:

代码语言:javascript
运行
复制
belongs_to :admin, -> { where(:roles => {name: :admin}) }, through: :roles, class_name: 'User', source: :users
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-23 05:03:05

您遇到了一个典型的误解,这是由于belongs_tohas_one的语义混淆造成的。

belongs_to将外键列放在此模型表上。使用belongs_to :admin Rails时,假定您有指向admins.idpolls.admin_id列。

belongs_to分析从不是间接的,因此没有through:选项。has_one有。

如果您想要保证Poll只能有一个管理员,那么您不想在这个特定情况下使用Rolify,而是使用:

代码语言:javascript
运行
复制
class Poll < ApplicationRecord
  resourcify
  # ...
  belongs_to :admin, class_name: 'User'
end

完全没问题。虽然Rolify提供了一种添加角色的方便方法,但并不是应用程序中的每个关联都应该被嵌入其中。与两个连接表相比,直接链接效率要高得多,并且提供了一个只存在一个值的守护符。

当你可能在想“如果我只使用has_one呢?”。has_one没有保证Poll只具有管理功能-它只是向查询添加了LIMIT 1

Rolify使用users_roles HABTM连接表连接用户和角色,例如,您无法在不影响整个系统的情况下向该表添加唯一性约束。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71975888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档