Где условие для поиска записи по нескольким параметрам в ассоциированной модели?

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я хочу найти связанную запись модели по нескольким параметрам, переданным в форме, чтобы создать user_product, который ассоциируется с моделью продукта.

Создайте метод в контроллере:

   @user_product = UserProduct.new(user_product_params)
  @product = Product.where(style_id: @user_product.style_id).where(size: @user_product.size).where(color: @user_product.color).where(country: @user_product.country)
  @user_product.product_id = @product.id
  

Модели:

Продукт:

   belongs_to :category, foreign_key: :category_id, class_name: "Category"
  belongs_to :style, foreign_key: :style_id, class_name: "Style"
  belongs_to :user_products
  

Пользовательский продукт:

   has_one :product
  has_many :orders
  

Форма проходит:
размер, цвет, style_id, category_id

Я продолжаю получать ошибку:

 undefined method `id' for #<Product::ActiveRecord_Relation:x> Did you mean? ids
  

Передается все, кроме product_id.

Как я могу найти product_id, используя несколько параметров, переданных в форме?

Ответ №1:

where возвращает массив записей, но вы ищете только одну запись. Вы можете использовать find_by , который возвращает первую запись, соответствующую условиям (или nil, если ничего не найдено):

 @product = Product.find_by(
  style_id: @user_product.style_id,
  size:     @user_product.size,
  color:    @user_product.color,
  country:  @user_product.country
)
if @product
  @user_product.product_id = @product.id
else
  # add an error if the product is not found,
  # or do something else
end
  

Ответ №2:

Проблема, с которой вы столкнулись, совершенно ясна из сообщения об ошибке. Как видно, у вас есть не один продукт с, а отношение, возможно, нескольких продуктов. undefined method 'id' for #<Product::ActiveRecord_Relation:x> Did you mean? ids id Так что вы можете попробовать: @product.first.id вместо этого.

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

1. Спасибо. Хорошо, так что это сработало. Однако меня смущает то, что каждая запись уникальна в том смысле, что ни одна запись в модели продукта никогда не будет иметь всех атрибутов, соответствующих другой записи в модели продукта. Итак, для этого .where не должен находить единственный и неповторимый, не прибегая к первому использованию? Или я что-то упускаю из виду, и если да, можете ли вы немного объяснить

2. Если вы используете .where() предложение для поиска объекта, у вас обычно есть не один объект, соответствующий вашему поиску, а несколько. Вот почему ActiveRecord_Relation возвращается an . Когда вы заранее знаете, что будет возвращен только один возможный элемент, вы должны использовать .find_by методы , которые уже предлагал @max.

3. @uno вы также должны указать проверки модели и ограничения базы данных для этого требования к уникальности

Ответ №3:

Поскольку вы используете запрос where , он вернет ActiveRecord::Relation , который имеет форму массива, даже если он возвращает одну запись. итак, ваша переменная @product имеет результат в виде массива, если вы уверены, что получите только одну запись из этого запроса, вам следует использовать .take метод, но я предлагаю вам использовать .find_by метод для поиска записи.

Ответ №4:

where предложение возвращает ActiveRecord объект (ы) в a ActiveRecord_Relation , который является своего рода Array единственной записью. Попробуйте это

 @user_product = UserProduct.new(user_product_params)
@products = Product.where(style_id: @user_product.style_id, size: @user_product.size, color: @user_product.color, country: @user_product.country)
@user_product.product_id = @products.first.id
  

Надеюсь, вы найдете это полезным!!!

Ответ №5:

где условие дает вам результат в массиве.

Попробуйте это

 @product.first.id