0

多対多の関係で最初のレコードを返すか、存在しない場合は作成するかなり単純なクエリがあります。

UserCategorization.where(category_id: 3, user_id: 5).first_or_create

私のモデルは次のようになります。

class UserCategorization < ActiveRecord::Base
    belongs_to :user
    belongs_to :category

    self.primary_key = [:user_id, :category_id]
end

ただし、SQL で無効な列名が生成されます。

SQLite3::SQLException: no such column: user_categorizations.[:user_id, :category_id]:

SELECT  "user_categorizations".* FROM "user_categorizations"  WHERE
"user_categorizations"."category_id" = 3 AND "user_categorizations"."user_id" = 5
ORDER BY "user_categorizations"."[:user_id, :category_id]" ASC LIMIT 1

モデルから削除するself.primary_key = [:user_id, :category_id]と、レコードを正しく取得できますが、WHERE 句で何を使用するかがわからないため、保存できません。

SQLite3::SQLException: no such column: user_categorizations.: 

UPDATE "user_categorizations" SET "score" = ? 
WHERE "user_categorizations"."" IS NULL

誰もこれを見たことがありますか?

4

2 に答える 2

0

次の 2 つの提案のいずれかが機能すると思います。

まず、次の移行を追加してみてください。

add_index :user_categorizations, [:user_id, :category_id]

必ずモデルに保管 self.primary_key = [:user_id, :category_id]してくださいUserCategorization

それでもうまくいかない場合は、 UserCategorizationテーブルを破棄して、次の移行を実行します。

def change
    create_table :user_categorizations do |t|
      t.references :user
      t.references :category
      t.timestamps
    end
end

referencesRails 4 の新機能です。指定された列に外部キーとインデックスを追加します。

幸運を!

于 2013-09-20T00:03:48.953 に答える
0

したがって、Rails 4 ActiveRecord は複合キーをうまく処理できないようで、多対多モデルが上記の問題を引き起こします。この ActiveRecord の拡張機能を使用して修正しました: http://compositekeys.rubyforge.org/

于 2013-09-20T03:22:45.287 に答える