我正在执行一个查询,其中正在检查表(购物车)中的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
答案 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
是您以某种方式获得的特定值的上下文中。它可以是任何值。 a
,b
,c
,可能是数据库中不存在的诸如z
或x
之类的东西。
假设item_id
在表中是唯一的,您的查询将返回一个包含1个元素的结果集(如果input_id
的值为a
,{{1} }或b
)或0个元素(如果c
是其他任何元素)。 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
的{{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中进行任何数据库编程了,所以我不确定这些天是什么。