2012-06-17 4 views
0

У меня есть модель рельсов, где я хочу обновить атрибут, вычислив текущее значение этого атрибута плюс значение, которое я отправляю в качестве параметра. Ниже будет обновлять запись и перезапись существующего значения атрибутаRails 3.2 условия обновления

def self.mark_receipt(qty_received,client_id,product_code) 
    Product.where(:client_id => client_id, :product_code => product_code) 
     .update_all(:qty_on_hand => :qty_received, 
        :qty_received => qty_received) 
end 

Я хочу что-то больше похоже на это, но следующий синтаксис не работает.

def self.mark_receipt(qty_received,client_id,product_code) 
    Product.where(:client_id => client_id, :product_code => product_code) 
     .update_all(:qty_on_hand => :qty_on_hand + qty_received, 
        :qty_received => :qty_received + qty_received) 
end 

EDIT

Получение очень близко с ниже ответ, но это то, что SQL работает в фоновом режиме

Product Load (0.5ms) SELECT `products`.* FROM `products` 
         WHERE `products`.`client_id` = 1 AND `products`.`product_code` = '88-89c' 
    SQL (0.6ms)   UPDATE `products` 
         SET `qty_on_hand` = 165, `qty_received` = 165 

Вместо

UPDATE `products` 
SET `qty_on_hand` = 165, `qty_received` = 165 
WHERE `products`.`client_id` = 1 AND `products`.`product_code` = '88-89c' 

ответ

3

Я считаю, что это будет работать на основе документации http://apidock.com/rails/ActiveRecord/Relation/update_all

Product.update_all(['qty_on_hand = qty_on_hand + ? , qty_received = qty_received + ?', qty_received, qty_received], 
        {:client_id => client_id, :product_code => product_code)}) 

Обратите внимание, что это будет сделать операцию добавления в базу данных.

+0

С вашим ответом я получаю ActiveRecord :: PreparedStatementInvalid (неверное число переменных привязки (1 для 2) в: qty_on_hand = qty_on_hand +?, Qty_received = qty_received +?): – ctilley79

+0

извините, я просто замечаю, что я забыли добавить второй параметр. Попробуйте сейчас –

+0

Это сделало. Спасибо – ctilley79

0

Поскольку вы обновление всех и количества на руке может измениться, вы должны прокрутить результаты предложения where:

def self.mark_receipt(qty_received,client_id,product_code) 
    Product.where(:client_id => client_id, :product_code => product_code).each do |p| 
    p.update_attributes(:qty_on_hand=> p.qty_on_hand + qty_received, :qty_received => p.qty_received + qty_received) 
    end 
end 

Я не проверял это, но это должно указывать на вас в правильном направлении.

+0

Он работает, однако, кажется, обновляет все записи, а не только то, что обнаруживает условие. Какой метод нужен для обновления только записи, соответствующей критериям, указанным в предложении where? – ctilley79

+0

С вашей помощью я очень близко. Посмотрите на выведенный выше вывод sql и посмотрите, где мы можем добраться отсюда. – ctilley79

+0

Небольшое примечание, вам не нужен «Продукт», поскольку область действия уже является объектом «Продукт», начиная с «где». Глядя на SQL теперь – MBHNYC

Смежные вопросы