【问题标题】:ActiveRecord::RecordInvalid: Validation failed: Left side must existActiveRecord::RecordInvalid:验证失败:左侧必须存在
【发布时间】:2015-07-07 21:51:43
【问题描述】:

我不知道为什么会发生这个错误。 我正在使用 master repo 中的 rails 5。

ActiveRecord::Base.transaction do
  q = Question.new({
    ... some random attrs
  })

  q.tests.build({
    name: 'teste',
    slug: 'teste',
    year: 1990
  })
  q.save!

end

class Question < ActiveRecord::Base
  has_and_belongs_to_many :tests, join_table: :tests_questions
end

class Test < ActiveRecord::Base
  has_and_belongs_to_many :questions, join_table: :tests_questions
end

跟踪的某些部分:

ActiveRecord::RecordInvalid: Validation failed: Left side must exist
activerecord/lib/active_record/validations.rb:67:in `raise_validation_error'
activerecord/lib/active_record/validations.rb:43:in `save!'
activerecord/lib/active_record/attribute_methods/dirty.rb:29:in `save!'
activerecord/lib/active_record/transactions.rb:303:in `block in save!'
activerecord/lib/active_record/transactions.rb:374:in `block in with_transaction_returning_status'
activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:210:in `transaction'
activerecord/lib/active_record/transactions.rb:210:in `transaction'
activerecord/lib/active_record/transactions.rb:371:in `with_transaction_returning_status'
activerecord/lib/active_record/transactions.rb:303:in `save!'
activerecord/lib/active_record/associations/has_many_through_association.rb:84:in `save_through_record'
activerecord/lib/active_record/associations/has_many_through_association.rb:47:in `insert_record'
activerecord/lib/active_record/autosave_association.rb:379:in `block in save_collection_association'
activerecord/lib/active_record/autosave_association.rb:370:in `each'
activerecord/lib/active_record/autosave_association.rb:370:in `save_collection_association'
activerecord/lib/active_record/autosave_association.rb:184:in `block in add_autosave_association_callbacks'
activerecord/lib/active_record/autosave_association.rb:157:in `instance_eval'
activerecord/lib/active_record/autosave_association.rb:157:in `block in define_non_cyclic_method'
activesupport/lib/active_support/callbacks.rb:428:in `block in make_lambda'
activesupport/lib/active_support/callbacks.rb:229:in `call'
activesupport/lib/active_support/callbacks.rb:229:in `block in halting_and_conditional'
activesupport/lib/active_support/callbacks.rb:502:in `call'
activesupport/lib/active_support/callbacks.rb:502:in `block in call'
activesupport/lib/active_support/callbacks.rb:502:in `each'
activesupport/lib/active_support/callbacks.rb:502:in `call'
activesupport/lib/active_support/callbacks.rb:90:in `run_callbacks'
activerecord/lib/active_record/callbacks.rb:305:in `_create_record'
activerecord/lib/active_record/timestamp.rb:57:in `_create_record'
activerecord/lib/active_record/persistence.rb:521:in `create_or_update'
activerecord/lib/active_record/callbacks.rb:301:in `block in create_or_update'
activesupport/lib/active_support/callbacks.rb:117:in `call'
activesupport/lib/active_support/callbacks.rb:117:in `call'
activesupport/lib/active_support/callbacks.rb:558:in `block (2 levels) in compile'
activesupport/lib/active_support/callbacks.rb:501:in `call'
activesupport/lib/active_support/callbacks.rb:501:in `call'
activesupport/lib/active_support/callbacks.rb:90:in `run_callbacks'
activerecord/lib/active_record/callbacks.rb:301:in `create_or_update'
activerecord/lib/active_record/suppressor.rb:41:in `create_or_update'
activerecord/lib/active_record/persistence.rb:151:in `save!'
activerecord/lib/active_record/validations.rb:43:in `save!'
activerecord/lib/active_record/attribute_methods/dirty.rb:29:in `save!'
activerecord/lib/active_record/transactions.rb:303:in `block in save!'
activerecord/lib/active_record/transactions.rb:374:in `block in with_transaction_returning_status'
activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:210:in `transaction'
activerecord/lib/active_record/transactions.rb:210:in `transaction'
activerecord/lib/active_record/transactions.rb:371:in `with_transaction_returning_status'
activerecord/lib/active_record/transactions.rb:303:in `save!'

当我使用= 方法而不是build 时,活动记录只是忽略join_table,将表名选择为questions_tests 而不是tests_questions

例如:

q.tests = [] of tests

NoMethodError: undefined method `questions_tests' for #<Question:0x0000000516b188>

【问题讨论】:

  • 这有什么更新吗?谢谢
  • 我刚刚更新了捆绑包,这个错误不再发生,但我现在收到一个枚举错误:NoMethodError: undefined method 'each_with_index' for true:TrueClassrails-e18bf1dc4922/activerecord/lib/active_record/enum.rb:159:in 'block (2 levels) in enum'
  • 更新并没有解决我的问题。我开了一个issue
  • @masciugo,实际上,错误仍然存​​在,但枚举错误正在掩盖它(是的,一个新错误!¬¬)

标签: ruby-on-rails activerecord


【解决方案1】:

问题已在this issue 中解决。

正如@pixeltrix 所说:

嗯,看起来像是上的 belongs_to 关联之一 构造的连接模型没有指向正确的列,所以可以看到 为零。以前这不是问题,但因为我们需要 默认情况下,belongs_to 关联现在它会爆炸。简单的解决方法是 只是将 optional: true 放在 :left_side 关联上 构建,但我认为我们可以做得更好?

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多