【发布时间】:2017-03-04 18:27:33
【问题描述】:
User 和 Role 之间存在多对多。这是我的架构:
ActiveRecord::Schema.define(version: 20161022143228) do
create_table "roles", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "roles_users", force: :cascade do |t|
t.integer "user_id"
t.integer "role_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "type_of"
t.index ["role_id"], name: "index_roles_users_on_role_id"
t.index ["user_id"], name: "index_roles_users_on_user_id"
end
create_table "users", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
这是我所有的联想:
角色
class Role < ApplicationRecord
has_many :dev_roles_users, -> { dev }, class_name: 'RolesUser'
has_many :admin_roles_users, -> { admin }, class_name: 'RolesUser'
has_many :dev_users, through: :dev_roles_users, class_name: 'User', source: :user
has_many :admin_users, through: :admin_roles_users, class_name: 'User', source: :user
end
用户
class User < ApplicationRecord
has_many :dev_roles_users, -> { dev }, class_name: 'RolesUser'
has_many :admin_roles_users, -> { admin }, class_name: 'RolesUser'
has_many :dev_roles, through: :dev_roles_users, class_name: 'Role', source: :role
has_many :admin_roles, through: :admin_roles_users, class_name: 'Role', source: :role
end
角色用户
class RolesUser < ApplicationRecord
belongs_to :user
belongs_to :role
scope :admin, -> { where(type_of: 'admin') }
scope :dev, -> { where(type_of: 'dev') }
enum type_of: ['admin', 'dev']
end
在rails c 中,我尝试执行以下操作:
r = Role.create(name: 'super_secret_admin')
u = User.new(name: 'john')
u.admin_roles << r
u.save
最后一行导致回滚。
u.errors 给@messages={:dev_roles_users=>["is invalid"]}
如果我先保存用户,它会起作用:
r = Role.create(name: 'super_secret_admin')
u = User.create(name: 'john')
u.admin_roles << r
u.save
疯狂的是,下面的设置使上面的所有代码行都正常工作!用户与其“未决”关联同时被保存。
这是我的架构:与上面相同
这是我所有的联想:
角色
class Role < ApplicationRecord
has_and_belongs_to_many :users
end
用户
class User < ApplicationRecord
has_and_belongs_to_many :roles
end
在rails c 中,我现在可以执行以下操作:
r = Role.create(name: 'super_secret_admin')
u = User.new(name: 'john')
u.roles << r
u.save
谁能解释一下如何使作用域关联起作用?我需要以相同的形式创建一个具有多个角色的用户。
更新 感谢您对如何设计我的角色架构提出意见和建议。不幸的是我对它不感兴趣。我们面临这个问题的应用程序甚至没有角色。所以让我更清楚一点,问题是:
如何将关联分配给用户,然后保存用户(如果其关联是使用范围/lambdas 构建的,则同时保存其“待定”关联?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4 activerecord ruby-on-rails-5