如何正确检查数据库中的值:在表中我有add_after_sign_in
一个布尔字段,默认情况下它是假的......但是如何检查它是否不为空且不为真,然后选择这样的行:我尝试:
litem = LineItem.find(:all, :conditions => {:cart_id => cart_id && !:add_after_sign_in })
但实际上没有这样的记录......为什么?简单的如何检查非真表行值?
如何正确检查数据库中的值:在表中我有add_after_sign_in
一个布尔字段,默认情况下它是假的......但是如何检查它是否不为空且不为真,然后选择这样的行:我尝试:
litem = LineItem.find(:all, :conditions => {:cart_id => cart_id && !:add_after_sign_in })
但实际上没有这样的记录......为什么?简单的如何检查非真表行值?
conditions
是一个哈希。您只是在弄乱语法。试试这个:
litem = LineItem.find(:all,
:conditions => {:cart_id => cart_id, :add_after_sign_in => [nil, false]})
您不能使用这样的符号(但请注意,您可以使用squeel和 Rails 3 做类似的事情)。
我会写(注意它是line_items
,它是一个集合):
line_items = LineItem.where(:cart_id => cart_id, :add_after_sign_in => false)
但是,有了健全的模型结构和命名范围,您应该能够编写更多的声明性代码:
line_items = Cart.find(cart_id).line_items.without_add_after_sign_in
您还可以使用where
更易读的语法:
litem = LineItem.where(cart_id: cart_id, add_after_sign_in: [nil, false])
或者,使用范围:
class LineItem
scope :not_added_after_sign_in, where(add_after_sign_in: [nil, false])
#...
end
litem = LineItem.where(cart_id: cart_id).not_added_after_sign_in
编辑:在tokland的回答之后进行了调整。