Другое заявление не показывает никакого результата - PullRequest
0 голосов
/ 16 февраля 2019

Я выполняю запрос, где проверяю item_id из таблицы (корзины).Когда я проверяю результат, используя условие if и else, условие else не дает никакого ответа.

 begin
  statement = Connection.conn.prepare("SELECT item_id from cart where item_id IN (?) ")
  result3 = statement.execute(input_id)
  result3.each do |row|
    if ( row["item_id"] == input_id )
      puts 'Already in cart'
      puts row["item_id"]
    else
      puts 'Added to cart'
      puts row["item_id"]
    end
  end
rescue Exception => e    
  puts "#{e.message}"
  puts "#{e.backtrace.inspect}"
  Connection.conn.close
end

1 Ответ

0 голосов
/ 16 февраля 2019

Условия в вашем операторе SQL и вашем коде Ruby, повторяющемся в наборе результатов, являются взаимоисключающими.

Допустим, таблица cart содержит следующие элементы:

  • item_id: a
  • item_id: b
  • item_id: c

Этот оператор выполняется

statement = Connection.conn.prepare("SELECT item_id from cart where item_id IN (?) ")
result3 = statement.execute(input_id)

в контексте, где input_idконкретное значение, которое вы получили как-то.Это может быть любое значение.a, b, c, потенциально что-то, чего нет в вашей базе данных, например z или x.

Если предположить, что item_id уникален в таблице, вашЗапрос вернет набор результатов, который будет содержать 1 элемент (если значение input_id равно a, b или c) или 0 элементов (если input_id - это что-то еще).result3 будет пустым или будет содержать один элемент, чей item_id совпадает с input_id.Запрос буквально переносится на Дайте мне товар, чей item_id равен <whatever the value of input_id happens to be>

Во время выполнения мы рассматриваем два возможных сценария.Давайте начнем с пустого набора результатов (элементы с данным input_id не найдены)

result3.each do |row|
   # your code
end

ничего не делает, потому что в result3.

нет элементов.вы можете получить массив с элементом корзины с item_id из a, b или c, в зависимости от того, что вы передали как input_id.

В этом случаеelse условие никогда не выполняется

[{'item_id' => 'a'}].each do |row|
    if ( row["item_id"] == 'a' ) # Always true because the item in the result set was selected by its index, 'a'
        puts 'Already in cart'
        puts row["item_id"]
    else
        puts 'Added to cart'
        puts row["item_id"]
    end
end

Эта логика ошибочна.Похоже, вы пытаетесь проверить, существует ли уже элемент с данным идентификатором в таблице cart, и добавить элемент в таблицу, если его нет.SELECT заявление никогда не сделает этого.Это похоже на работу для оператора INSERT.SQL - очень мощный язык сам по себе.Если вас это смущает, вы можете взглянуть на Active Record , который абстрагирует ее, скрывая базу данных за объектно-ориентированным фасадом.Я давно не программировал базы данных на Ruby, поэтому не уверен, что круто в эти дни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...