我创建了一个这样的连接表:
class CreateJoinTablePurchaseUser < ActiveRecord::Migration[5.0]
def change
create_join_table :purchases, :users, table_name: :participation_requests do |t|
# t.index [:purchase_id, :user_id]
# t.index [:user_id, :purchase_id]
t.boolean :approved, default: false
end
end
这是我的模特:
class ParticipationRequest < ApplicationRecord
end
我在表格中成功创建了一行。但是,当我尝试像这样更新布尔值时:
pr = ParticipationRequest.find_by(user_id: 1, purchase_id: 1)
pr.update_attributes(approved: true)
pr返回行,我在更新时收到ROLLBACK并显示以下消息:
TypeError: nil is not a symbol nor a string
我认识到连接表与其他表的不同之处在于它没有像常规表那样被索引。主键似乎是user_id和purchase_id的组合。我在任何其他表上使用update_attributes都没有问题。这个连接表有什么不同之处,不允许我这样更新属性吗?
答案 0 :(得分:1)
create_join_table
创建没有主键的表。并且ActiveRecord
无法在没有主键的情况下更新记录。因此,您无法更改记录中的任何字段,approved
也不能user_id
或purchase_id
。 (Rails认为你不应该手动更新&#34;连接表的记录&#34;)
如果您需要更改此类型号的记录,您可以使用gem Composite Primary Keys。
将gem添加到Gemfile
:
gem 'composite_primary_keys'
为表添加唯一索引(这是可选的,但更好):
class AddUniqueIdnexToParticipationRequests < ActiveRecord::Migration
def change
add_index :participation_requests, [:purchase_id, :user_id], unique: true
end
end
并将primary_keys
设置为您的模型:
class ParticipationRequest < ActiveRecord::Base
self.primary_keys = :purchase_id, :user_id
belongs_to :purchase
belongs_to :user
end
这就是全部,现在你的&#34;加入表&#34;记录应该能够更新。