2017-03-22 4 views
0

ユーザモデルでは、アーカイブがあります!メソッドが破棄されたときに呼び出されます。Railsフェッチgroup_id別のテーブルから

ユーザーには、ユーザーが破棄されたときに新しいArchivedUserGroupテーブルに格納する必要がある多数のユーザーグループがあります。

ArchivedUserは正常に作成されましたが、UserGroupテーブルからUsers 'group_idをフェッチする際に問題があります。

 ArchivedUserGroup.create(
     user_id: self.id, 
     group_id: UserGroup.where(:user_id => self.id).pluck(:group_id).to_set 
    ) 

私を助けてくれたことのある人のためのおかげで、私はRailsの使用を開始し、かなり複雑なコードベースで作業を取得しています。

答えて

1

ユーザーごとに多くのUserGroupレコードがあり、ArchivedUserGroupには通常のUserGroup(user_id、group_id)と同じ属性があるため、UserGroupレコードごとにArchivedUserGroupを作成する必要があります。あなたはset(配列のような)をgroup_idカラムに渡そうとしています。あなたのスキーマは表示されていませんが、おそらくgroup_idは外部キーなので整数です。したがって、データ型の不一致があります。代わりに、あなたはこれを行うことができます:反復で起こっDBコール(作成)がありますので、一部のユーザーは、ユーザーグループの数が多い場合には

UserGroup.where(user_id: self.id).each do |user_group| 
    ArchivedUserGroup.create(
    user_id: self.id, 
    group_id: user_group.group_id 
) 
end 

が、これは時間がかかることがあります。これはN + 1クエリとして知られており、この場合の周囲の方法は、生のSQLやbulk_insert gemなどの一括挿入を使用することです。

+0

私はuser_idがself.idと等しいUserGroupをループすることを考えていました...なぜこれをもっと早く試していないのか分かりません。あなたの説明に感謝します。私はこのような何かをカバーするチェックアウトする必要があります読書をお持ちですか? – VegaStudios

+0

@VegaStudios ActiveRecordのRailsガイドが始まりです。 –

関連する問題