如何在Rails 5中使用Active Record更新postgres布尔字段?

时间:2017-03-18 22:58:16

标签: ruby-on-rails rails-activerecord ruby-on-rails-5

我创建了一个这样的连接表:

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 个答案:

答案 0 :(得分:1)

create_join_table创建没有主键的表。并且ActiveRecord无法在没有主键的情况下更新记录。因此,您无法更改记录中的任何字段,approved也不能user_idpurchase_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;记录应该能够更新。