2015-10-30 2 views
2

В Rails есть способ, которым я могу сделать вызов метода на основе изменения в базе данных? Например, скажем, у меня есть два класса: Products и Orders.Rails Методы, которые называют себя

Заказы есть три возможных значения перечислений:

class Order < ActiveRecord::Base 
     enum status: [:pending, :processing,:shipped] 
     belongs_to :products 
    end 

Я хотел бы партия процесс Orders так, когда продукт имеет 50 заказов, я хочу, чтобы установить все заказы, связанные с ним обработаны. Orders по умолчанию :pending. Изменить заказ :processing Я бы назвал order.processing!. Я мог бы написать метод в модель таких продуктов, как:

def process_orders 
    if self.orders.count=50 
    self.orders.each do |order| 
    order.processing! 
    end 
end 

Проблема в том, что я должен был бы вызвать метод process_orders для его выполнения, есть в любом случае я мог бы сделать это автоматически выполнить один раз продукт имеет 50 заказов?

ответ

3

Это звучит хорошая возможность использовать Active Record Callback.

class Order < ActiveRecord::Base 
    belongs_to :product 

    after_save do 
    product.process_orders if product.pending_threshold_met? 
    end 
end 

class Product < ActiveRecord::Base 
    has_many :orders 

    def pending_threshold_met? 
    orders.where(status: :pending).count >= 50 
    end 
end 
3

Я думаю, что вы можете использовать update_all обновить status столбец всех ваших заказов сразу, а зацикливание через них по одному:

self.orders.update_all(status: :processing) 

и завернуть, что внутри обратного вызова.

Что-то вроде этого:

class Order < ActiveRecord::Base 
    after_save do 
     product.process_orders if product.has_fifty_pending_orders? 
    end 

    # rest of your model code 
    end 

    class Product < ActiveRecord::Base 
    # rest of your model code 

    def process_orders 
     self.orders.update_all(status: :processing) 
    end 

    def has_fifty_pending_orders? 
     self.orders.where(status: :pending).count >= 50 
    end 
    end 
Смежные вопросы