其他语句未显示任何结果

时间:2019-02-16 07:48:37

标签: mysql ruby

我正在执行一个查询,其中正在检查表(购物车)中的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 :(得分:1)

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是您以某种方式获得的特定值的上下文中。它可以是任何值。 abc,可能是数据库中不存在的诸如zx之类的东西。

假设item_id在表中是唯一的,您的查询将返回一个包含1个元素的结果集(如果input_id的值为a,{{1} }或b)或0个元素(如果c是其他任何元素)。 input_id将为空,或者将包含一个元素,其result3item_id相同。该查询从字面上转换为input_iditem_id

的购物车商品给我

在运行时,我们正在研究两种潜在的情况。让我们从一个空的结果集开始(找不到具有给定<whatever the value of input_id happens to be>的元素)

input_id

什么也不做,因为result3.each do |row| # your code end 中没有元素。

您唯一能获得的是带有result3item_idab的{​​{1}}的购物车物品的数组,具体取决于您作为{ {1}}。

在这种情况下,永远不会满足c条件

input_id

这种逻辑是有缺陷的。您似乎想做的是检查else表中是否已经存在具有给定ID的项目,如果不存在则向该表中添加一个元素。 [{'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 语句永远不会那样做。这看起来像是INSERT语句的工作。 SQL本身就是一种非常强大的语言。如果您感到困惑,可以看看Active Record,它将其抽象化,将数据库隐藏在面向对象的外观后面。我已经很久没有在Ruby中进行任何数据库编程了,所以我不确定这些天是什么。