2016-04-17 13 views
0

私は、ユーザーとワークスペースの間にHABTMの関連付けがあります。これにはグループもあります。問題は、ユーザーからデータのイントログループを挿入できないことです。HABTMを介してデータを挿入

class User < ActiveRecord::Base 
has_and_belongs_to_many :workspaces #, dependent: :destroy 
has_many :groups,      through: :workspaces 
end 

class Workspace < ActiveRecord::Base 
    has_and_belongs_to_many :users,   dependent: :destroy 
    has_many     :groups,   dependent: :destroy 
end 

これは、テーブルの移行結合です:私は、新しいグループを作成しようとすると、レールコンソールで

class CreateUsersAndWorkspaces < ActiveRecord::Migration 
    def change 
    create_table :users_workspaces, id: false do |t| 
     t.belongs_to :user, index: true 
     t.belongs_to :workspace, index: true 
    end 
    end 
end 

を:

u.groups.create!(name: "txt", workspace_id: 1)                      
(0.1ms) begin transaction 
(0.2ms) rollback transaction 
    ActiveRecord::HasManyThroughNestedAssociationsAreReadonly: 
    Cannot modify association 'User#groups' because it goes 
    through more than one other association. 

は、ユーザからのグループを作成する方法はあります?

編集: @evedovelliの助けを借りて私はそれを動作させることができました。 user.workspaceはActiveRecord_Associations_CollectionProxyなので、ワークスペースクラスではなくコレクションです。 、

u.workspaces(id: 1).first.groups(id: 2).first.modelN(id:3).first.modelNplus1.create!(name: "txt") 

私の最後の質問があり、これは正しい方法です:

u.workspaces(id: 1).first.groups.create!(name: "txt") 

は今、私はより多くの団体があるとします。「最初の」追加最終的なコードがあるので、問題を解決しましたか?

+0

問題はRailsがユーザーからグループをワークスペース何に出て見つけることができないということであるも、あなたがする場合(に追加する必要があります作成時にworspace_idを指定します)。 グループを作成するときにワークスペースIDを知っているので、単純に 'u.workspaces(id:1).groups.create!(name:" txt ")'で作成できません。 このようにして、適切なユーザーのワークスペースのグループを作成することができます。 (私は答えとしてこれを入力します) – evedovelli

+0

ただ答えを更新しました。モデルの正しいIDで検索するには 'find_by_id'を使います。 'first'は常に最初の項目をリストから返します。これはあなたが望むものではありません。 – evedovelli

答えて

1

問題はRailsがユーザーワークスペースグループは(あなたが行ったように、あなたが作成時にworspace_idを指定するためにも)に追加すべきかを知ることができないということです。

エラーメッセージで説明したように、HasManyThroughのネストされた関連付けは読み取り専用です。したがってグループユーザーから直接読み取ることはできますが、作成することはできません。それは右のユーザーワークスペースためグループを作成します

u.workspaces.find_by_id(1).groups.create!(name: "txt") 

この方法:

は、グループを作成するときにworkspace_idを知られているので、あなたは、単純にグループを作成することができます。

そして、あなたはこのような他の団体を通じてそれに続けることができるはずです。

u.workspaces.find_by_id(1).groups.find_by_id(2).modelN.find_by_id(3).modelNplus1.create!(name: "txt") 
+0

worksp.groups.create!(名前: "txt") u.workspaces(id:1).groups.create!(名前: "txt") NoMethodError:# のワークグループ:: ActiveRecord_Associations_ CollectionProxy:0x00000005bcefd0> – Gaston

+0

の回答がありません。私は私の質問を更新しました:D – Gaston

関連する問題