2012-02-08 4 views
0

Я новый пользователь RoR; Я хочу создать следующий оператор. У меня массив; Я хочу, что возвращение контроллера лжи, если все элементы массива не равны переменная value.this является кодомВернуть неверное заявление

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 для генерации pdf из RoR-данных? Спасибо всем

+2

Это не полезно сказать «это не работает ". Опишите, что не работает - укажите сообщения об ошибках, опишите, что вы ожидали, и т. Д. –

+2

Вы можете написать более подробную информацию о своей ошибке? Также для экспорта в формате pdf, проверьте 'whhtmltopdf' – ksol

+0

@marco, если это сработало для вас, пожалуйста, примите ответ. –

ответ

2

Try-л, как это:

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

На самом деле вы можете сделать это в БД:

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 выполнит «блок» (код между do/end) и вернет вам исходный массив.

Так что, если белый массив, пустой или нет, и вы говорите:

return false if [] 

рубин не возвращает ложь. вместо этого, вы бы, вероятно, скорее:

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

Вы, вероятно, хотите, чтобы он возвращает истину, если позиция является позиция сессии, так что вы можете переключиться на:

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