【问题标题】:How do I update a postgres boolean field using Active Record in Rails 5?如何在 Rails 5 中使用 Active Record 更新 postgres 布尔字段?
【发布时间】:2017-03-18 22:58:15
【问题描述】:

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

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 都没有问题。这个连接表有什么不同之处,不允许我以这种方式更新属性吗?

【问题讨论】:

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


    【解决方案1】:

    create_join_table 创建没有主键的表。而ActiveRecord 不能在没有主键的情况下更新记录。因此,您不能更改记录中的任何字段,approved 也不是 user_id 或 purchase_id。 (Rails 认为您不应该手动更新“连接表”的记录)

    如果您需要更改此类模型的记录,您可以使用 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
    

    就是这样,现在您的“连接表”记录应该可以更新了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      相关资源
      最近更新 更多