【问题标题】:How to save ActiveRecord object with SCOPED associations?如何使用 SCOPED 关联保存 ActiveRecord 对象?
【发布时间】:2017-03-04 18:27:33
【问题描述】:

UserRole 之间存在多对多。这是我的架构:

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=&gt;["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


【解决方案1】:

我认为分配角色需要一个 id,当您实例化用户并分配角色时,该 id 不存在。

你可以试试吗?

u = User.new(name: 'john', roles: [r])
u.save!

【讨论】:

    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多