1. ホーム
  2. ruby-on-rails

[解決済み] Rails 4 ActiveRecord::AssociationTypeMismatchについて

2022-02-25 02:09:26

質問

結合テーブルにレコードを追加しようとしています。 user_logs を結合する user_actionsusers . しかし、以下のコードで項目を追加しようとすると、以下のようなエラーメッセージが表示されます。なぜこのようなエラーが発生するのでしょうか?参考までに、以下にモデルとスキーマを載せておきます。

2.0.0-p353 :001 > user = User.first
2.0.0-p353 :002 > action = UserAction.first
2.0.0-p353 :003 > user.user_logs
UserLog Load (0.3ms)  SELECT `user_logs`.* FROM `user_logs` WHERE `user_logs`.`user_id` = 1
=> #<ActiveRecord::Associations::CollectionProxy []> 
2.0.0-p353 :004 > user.user_logs << action
(0.3ms)  BEGIN
(0.2ms)  ROLLBACK
ActiveRecord::AssociationTypeMismatch: UserLog(#2156995120) expected, got UserAction(#2177269140)

ユーザーモデル

class User < ActiveRecord::Base
   ...
   has_many :user_logs
   has_many :user_actions, :through => :user_logs
end

ユーザーアクションモデル

class UserAction < ActiveRecord::Base
   has_many :user_logs
   has_many :users, :through => :user_logs
end

ユーザーログ・モデル

class UserLog < ActiveRecord::Base
  belongs_to :user
  belongs_to :user_action
end

スキーマ

create_table "user_actions", force: true do |t|
  t.string   "action",     limit: 40, default: "", null: false
  t.datetime "created_at"
  t.datetime "updated_at"
end

add_index "user_actions", ["action"], name: "index_user_actions_on_action", unique: true, using: :btree

create_table "user_logs", force: true do |t|
  t.integer  "user_id"
  t.integer  "user_action_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

解決方法は?

を追加しようとしています。 UserAction オブジェクトを UserLog を投げます。 TypeMismatch エラーが発生します。代わりにこれを試してみてください。

user = User.first
action = UserAction.first
user.user_actions << action
user.save