我是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? 谢谢大家
答案 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