#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