2017-03-18 69 views
1

我創建了一個連接表所示:如何在Rails 5中使用Active Record更新postgres布爾型字段?

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都沒有問題。這個連接表有什麼不同,不允許我以這種方式更新屬性?

回答

1

create_join_table創建沒有主鍵的表。如果沒有主鍵,ActiveRecord不能更新記錄。因此,您無法更改記錄中的任何字段,既不是approved也不是user_idpurchase_id。 (Rails認爲你不應該手動更新「連接表」的記錄)

如果您需要更改此類模型的記錄,您可以使用寶石Composite Primary Keys

添加寶石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 

就是這樣,現在你的「連接表」記錄應該能夠更新TE。

+1

謝謝!它工作出色! – arjis02

相關問題