2012-02-08 104 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] }