Понимание «где» и как его использовать в Ruby на Rails - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть таблица с именем product_variations, и эта таблица имеет_many products.

Когда я go на консоль Rails, я могу сделать это:

2.6.3 :036 > var = ProductVariation.first
  ProductVariation Load (0.2ms)  SELECT `product_variations`.* FROM `product_variations` ORDER BY `product_variations`.`id` ASC LIMIT 1
 => #<ProductVariation id: 16, product_id: 1024, color_id: 19, quantity: 1, size: "GG", sub_sku: 10, created_at: "2020-02-18 14:41:46", updated_at: "2020-02-18 14:41:46">
2.6.3 :037 > var.size
 => "GG"

Так вот и работает. Но когда я пытаюсь найти что-то там, используя where, я получаю это целое число:

2.6.3 :038 > var = ProductVariation.where(product_id: 1024, sub_sku: 10)
  ProductVariation Load (0.4ms)  SELECT `product_variations`.* FROM `product_variations` WHERE `product_variations`.`product_id` = 1024 AND `product_variations`.`sub_sku` = 10 LIMIT 11
 => #<ActiveRecord::Relation [#<ProductVariation id: 16, product_id: 1024, color_id: 19, quantity: 1, size: "GG", sub_sku: 10, created_at: "2020-02-18 14:41:46", updated_at: "2020-02-18 14:41:46">]>
2.6.3 :039 > var.size
   (0.2ms)  SELECT COUNT(*) FROM `product_variations` WHERE `product_variations`.`product_id` = 1024 AND `product_variations`.`sub_sku` = 10
 => 1

Обратите внимание, что когда я пытаюсь использовать var.size, консоль выполняет другой поиск в базе данных, но теперь использует SELECT COUNT(*) вместо SELECT, а на выходе будет 1 (хотя должно быть GG, почему?). Насколько я понял до сих пор, where может вернуть много результатов. Вот почему он использует COUNT? Но как я могу использовать результат? В этом приложении, над которым я работаю, за таблицей product_variations у меня будет только одно совпадение с product_id и sub_sku, поэтому я хочу, чтобы оно вернуло эту строку, но не могу понять, как использовать where, чтобы сделать это.

1 Ответ

2 голосов
/ 18 февраля 2020

вы можете использовать .first после where

var = ProductVariation.where(product_id: 1024, sub_sku: 10).first

или использовать метод find_by

var = ProductVariation.find_by(product_id: 1024, sub_sku: 10)

, который будет делать то же самое

...