1

私はUserRoleの間に多くのタムを持っています。ここに私のスキーマは次のとおりです。SCOPED関連でActiveRecordオブジェクトを保存するにはどうすればいいですか?

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 

RolesUse R Iは、次の操作を実行しようとrails c

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 

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 

誰でもスコープ団体を動作させる方法について説明していただけますか?私は、同じ形式で多くの役割を持つユーザーを作成する必要があります。


UPDATE 私の役割のアーキテクチャを設計する方法についてのアドバイスや提案をいただき、ありがとうございます。残念ながら私はそれに興味がありません。私たちがこの問題に直面しているアプリには役割はありません。だから私はもっと明確にして、質問は:

私はどのように私は、ユーザーに関連付けを割り当てることができます(同時にその "保留中"の関連付けと "その関連がスコープを使用して構築されている場合) /ラムダ?

+0

http://stackoverflow.com/questions/40228134/how-to-use-inverse-of-with-multiple-associations?noredirect=1#comment67723540_40228134 – Claudio

答えて

0

ユーザーをインスタンス化して役割を割り当てるときに、idが存在しない場合、役割を割り当てるにはIDが必要だと思います。

お試しいただけますか?

u = User.new(name: 'john', roles: [r]) 
u.save! 
関連する問題