1

我想在两个模型 Bar 和 Foo 之间创建一个树结构。

酒吧有很多 Foos

    Bar
  /  |  \
Foo Foo Foo
         ¦
        Bar
      /  |  \
    Foo Foo Foo

Bar 可以选择属于 Foo。

酒吧有许多 Foos,无穷无尽……

我配置了这样的东西,但它似乎没有正确播种。

即使我注释掉我拥有的任何验证,我也会收到以下错误:

ActiveRecord::RecordInvalid: Validation failed: Foos bar must exist

我不明白为什么。

class Bar < ApplicationRecord
  has_many :foos, inverse_of: :bar

  accepts_nested_attributes_for :foos
end


class Foo < ApplicationRecord
  belongs_to :bar, inverse_of: :foos

  accepts_nested_attributes_for :bar
end


class CreateFoos < ActiveRecord::Migration[6.1]
  def change
    create_table :foos do |t|
      t.text :description, null: false

      t.timestamps
    end
  end
end

class CreateBars < ActiveRecord::Migration[6.1]
  def change
    create_table :bars do |t|
      t.text :description

      t.references :foo,
        foreign_key: true,
        null: true,
        on_delete: :cascade,
        on_update: :cascade

      t.timestamps
    end
  end
end

class AddBarIdToFoosTable < ActiveRecord::Migration[6.1]
  def change
    add_reference :foos,
      :bar,
      foreign_key: true,
      null: false,
      on_delete: :cascade,
      on_update: :cascade
  end
end


Bar.create!([
  {
    description: 'Lorem ipsum...',
    foos_attributes: [
      {
        description: 'Lorem ipsum...',
        bar_attributes: {
          description: 'Lorem ipsum...',
          foos_attributes: [
            {
              description: 'Lorem ipsum...',
              bar_attributes: {
                description: 'Lorem ipsum...',
                foos_attributes: [
                  {
                    description: 'Lorem ipsum...'
                  },
                  {
                    description: 'Lorem ipsum...'
                  },
                  {
                    description: 'Lorem ipsum...'
                  },
                  {
                    description: 'Lorem ipsum...'
                  }
                ]
              }
            }
          ]
        }
      }
    ]
  }
])
4

1 回答 1

2

ActiveRecord::RecordInvalid: Validation failed: Foos bar must exist

  • 这告诉您,您的 Foo 声明之一需要存在bar
  • Foo 模型声明中的引用barbelongs_to关联中
  • belongs_to在某些版本的 rails 中默认存在验证;更改belongs_to :barbelongs_to :bar, optional: true可能会解决您的问题

参考:https ://github.com/rails/rails/pull/18937/files

于 2021-11-19T01:49:56.370 回答