多対多の関係で最初のレコードを返すか、存在しない場合は作成するかなり単純なクエリがあります。
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
誰もこれを見たことがありますか?