返回虚假陈述

时间:2012-02-08 15:33:34

标签: ruby-on-rails

我是RoR的新手;我想创建以下语句。我有一个阵列;如果所有数组元素都不等于变量值,我希望该控制器返回false。这是代码

def check_warehouse(asset,serial)
  wh = Warehouse.where(["(asset = ? and serial = ?) OR (asset = ?) OR (serial= ?)",asset,serial,asset,serial])
  return false if wh.count > 1
  return false if
  wh.each do |wh|
    wh.position_id != session[:position_id]
  end
end

但它不起作用!为什么?

此外,你能否建议我在Rails 3.1上运行一个插件或gem来从RoR数据生成pdf? 谢谢大家

2 个答案:

答案 0 :(得分:3)

您有以下代码:

return false if wh.each do |wh|
  wh.position_id != session[:position_id]                    
end

这不会按照您想要的方式执行。在ruby中,.each将执行“block”(do / end之间的代码)并返回原始数组。

因此,如果wh是一个数组,是否为空,你说:

return false if []

ruby​​不会返回false。相反,你可能宁愿:

return false if wh.any? {|wh| wh.position_id != session[:position_id] }

如果位置是会话位置,您可能希望它返回true,因此您可以切换到:

return wh.any?{|wh| wh.position_id == session[:position_id] }

答案 1 :(得分:2)

尝试这样的smth:

def check_warehouse(asset,serial)
  wh = Warehouse.where(["(asset = ?) OR (serial= ?)",asset,serial]) # first condition was just extra
  return false if wh.detect {|wh| wh.position_id != session[:position_id] }
end

我删除了return false if wh.count > 1,因为如果你有超过1个元素,那么检查数组是没有意义的。如果我误解了你,请告诉我

UPD

实际上你可以在db:

中做到这一点
def check_warehouse(asset,serial)
  Warehouse.where(
    ["(asset = ? OR serial= ?) AND NOT position_id = ?", asset, serial, session[:position_id]]
  ).count.zero?
end