Как заполнить принадлежит и имеет много ассоциаций с seeds.rb

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

У меня есть две модели. Один из них — категории, а другой — продукты. Я уже заполнил таблицу categories, и теперь мне нужно заполнить таблицу products идентификатором категории. Я использую faker для этой совокупности.

Модели и файл seeds.rb выглядят следующим образом

 class Product < ApplicationRecord
    belongs_to :categories
end

class Category < ApplicationRecord
    has_many :products
end
  

seeds.rb

 category = Category.ids

100.times do
    Product.create!([{
        name_product: Faker::Commerce.product_name
    },
    {
        value_product: Faker::Commerce.price
    },
    {
        category_id: category.sample
    }
    ])
end
  

Но я продолжаю получать сообщение об ошибке «проверка не удалась. Категории необходимы «, даже передавая идентификатор категории.
Если я прокомментирую ассоциацию внутри модели продукта, это сработает, но это не решение.

Комментарии:

1. Не могли бы вы подтвердить, что ваша category переменная (которую было бы гораздо лучше переименовать в category_ids или аналогичную) определенно содержит массив идентификаторов, пожалуйста?

Ответ №1:

Я думаю, ваша проблема заключается в том, как вы пытаетесь создавать продукты.

Ваш текущий код попытается создать три продукта, поскольку вы передаете массив хэшей, два из которых не имеют идентификатора категории:

 Product.create!([
  {
    name_product: Faker::Commerce.product_name # << first product, no category
  },
  {
    value_product: Faker::Commerce.price # << second product, no category 
  },
  {
    category_id: category.sample # << third product
  }
])
  

Из вашего вопроса немного неясно, но попробуйте вместо этого следующее в вашем 100.times do блоке:

 Product.create!(
    name_product: Faker::Commerce.product_name,
    value_product: Faker::Commerce.price,
    category_id: category.sample
)
  

Или:

 Product.create!([
  {
    name_product: Faker::Commerce.product_name,
    category_id: category.sample
  },
  {
    value_product: Faker::Commerce.price,
    category_id: category.sample
  },
  {
    category_id: category.sample
  }
])
  

Первый создаст единственную запись, если в каждом экземпляре есть name_product , value_product и category_id столбцы; последние три продукта, все из которых имеют category_id .

Дайте мне знать, как у вас дела и помогает ли это вообще.


Редактировать

Похоже, ваша ассоциация настроена неправильно. Попробуйте:

 class Product < ApplicationRecord
  belongs_to :category
end
  

Комментарии:

1. Это выдает ту же ошибку. ActiveRecord :: RecordInvalid: ошибка проверки: Требуются категории

2. @lufizi Я обновил свой ответ: я думаю, что проблема в настройке ваших ассоциаций. Попробуйте обновить нижний раздел и посмотрите, заработает ли это.

3. Отлично, рад, что это помогло!