在Rails 5中使用带有多个嵌套项的update_attributes时出错

时间:2016-07-13 07:43:20

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

我有两个带has_many :through连接模型的模型,如下所示:

class Brief < ApplicationRecord
  has_many :brief_product_benefits
  has_many :product_benefits, through: :brief_product_benefits

  accepts_nested_attributes_for :brief_product_benefits, :allow_destroy => true

  ...
end


class ProductBenefit < ApplicationRecord

  has_many :brief_product_benefits
  has_many :briefs, through: :brief_product_benefits

end

class BriefProductBenefit < ApplicationRecord

  belongs_to :brief
  belongs_to :product_benefit

end

当我尝试通过BriefProductBenefit同时更新多个@brief.update_attributes个对象时,我收到一个奇怪的错误。以下是我得到的结果:

假设我像这样获取一条记录:

brief = Brief.find(1)

成功创建(插入两条新记录):

brief_params = {"brief_product_benefits_attributes"=>[{"id"=>"", "product_benefit_id"=>"1"}, {"id"=>"", "product_benefit_id"=>"2"}]}
brief.update_attributes(brief_params)

-> INSERT INTO "brief_product_benefits" ("brief_id", "product_benefit_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["brief_id", 2], ["product_benefit_id", 1], ["created_at", 2016-07-13 07:33:54 UTC], ["updated_at", 2016-07-13 07:33:54 UTC]]
-> INSERT INTO "brief_product_benefits" ("brief_id", "product_benefit_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["brief_id", 2], ["product_benefit_id", 2], ["created_at", 2016-07-13 07:33:54 UTC], ["updated_at", 2016-07-13 07:33:54 UTC]]

成功更新(更新product_benefit_id):

brief_params = {"brief_product_benefits_attributes"=>[{"id"=>"3", "product_benefit_id"=>"2"}]}
brief.update_attributes(brief_params)

-> UPDATE "brief_product_benefits" SET "product_benefit_id" = $1, "updated_at" = $2 WHERE "brief_product_benefits"."id" = $3  [["product_benefit_id", 2], ["updated_at", 2016-07-13 07:35:10 UTC], ["id", 3]]

成功删除(删除ID为3的BriefProductBenefit):

brief_params = {"brief_product_benefits_attributes"=>[{"id"=>"3", "product_benefit_id"=>"2", "_destroy":true}]}
brief.update_attributes(brief_params)

-> DELETE FROM "brief_product_benefits" WHERE "brief_product_benefits"."id" = $1  [["id", 3]]

发送嵌套对象数组时更新失败:

brief_params = {"brief_product_benefits_attributes"=>[{"id"=>"2", "product_benefit_id"=>"1"}, {"id"=>"3", "product_benefit_id"=>"1"}]}
brief.update_attributes(brief_params)

-> (0.1ms)  BEGIN
-> (0.2ms)  ROLLBACK

然后我得到以下堆栈跟踪:

ArgumentError: wrong number of arguments (given 1, expected 2)
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/reduce.rb:12:in `visit'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/postgres_ext-3.0.0/lib/postgres_ext/arel/4.1/visitors/postgresql.rb:22:in `block in visit_Array'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/postgres_ext-3.0.0/lib/postgres_ext/arel/4.1/visitors/postgresql.rb:22:in `map'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/postgres_ext-3.0.0/lib/postgres_ext/arel/4.1/visitors/postgresql.rb:22:in `visit_Array'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/reduce.rb:13:in `visit'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/to_sql.rb:641:in `visit_Arel_Nodes_In'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb:13:in `visit_Arel_Nodes_In'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/reduce.rb:13:in `visit'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/to_sql.rb:808:in `block in inject_join'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/to_sql.rb:806:in `each'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/to_sql.rb:806:in `each_with_index'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/to_sql.rb:806:in `each'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/to_sql.rb:806:in `inject'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/to_sql.rb:806:in `inject_join'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/to_sql.rb:657:in `visit_Arel_Nodes_And'
from /Users/holiday/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/arel-7.0.0/lib/arel/visitors/reduce.rb:13:in `visit'

1 个答案:

答案 0 :(得分:2)

这里的问题相同,但是像Post.where这样的简单操作(id:[1,2,3]) Rails 5也是,相同的Arel版本,相同的reduce.rb行

编辑:通过删除gem'postgres_ext'修复,显然它还没有支持rails 5