2012-02-08 103 views
0

我是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

这无助于说“它不起作用“。描述什么不起作用 - 提供错误信息,描述你期望发生的事情等。 – 2012-02-08 15:37:36

+2

你能更加描述你的错误吗?同样对于PDF导出,请查看'whhtmltopdf' – ksol 2012-02-08 15:39:59

+0

@marco如果这对你有用,请接受答案。 – 2012-02-17 18:29:59

回答

2

尝试水木清华这样的:

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 
3

你有这样的代码:

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

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

所以,如果WH是一个数组,空的或没有,你说:

return false if [] 

红宝石不会返回false。相反,你很可能宁愿:

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

你可能会希望它返回true,如果位置是会话的位置,这样你就可以切换到:

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