2012-01-15 2 views
5

Просто интересно, есть ли способ сделать условный обратный вызов в Rails. Я знаю, что вы можете сделать условную проверку следующим образом:Условный обратный вызов в модели Rails?

validates_uniqueness_of :email, :if => (1==1) 

Я часто делать вещи, как это в моих обратных вызовов:

class LineItem < ActiveRecord::Base 
    belongs_to :invoice 
    belongs_to :line_item_group 

    before_create :set_invoice_id 
    def set_invoice_id 
    unless self.invoice_id 
     self.invoice_id = self.line_item_group.invoice_id 
    end 
    end 
end 

Было бы здорово, чтобы убрать, что немного.

ответ

10
class LineItem < ActiveRecord::Base 
    before_create :set_invoice_id, :unless => :invoice_id 

    def set_invoice_id 
    self.invoice_id = line_item_group.invoice_id 
    end 
end 
+0

Вы правы, это не ортодоксальный SQL, и мне это нравится. :) Я готов пожертвовать нормальностью для меньших объединений. – tybro0103

12

Да, вы можете.

class Order < ActiveRecord::Base 
    before_save :normalize_card_number, :if => :paid_with_card? 
end 

См. http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks для получения дополнительной информации по этой теме.

+0

Я думаю, что OP хочет рефакторинга второго фрагмента, но вопрос непонятен ... – tokland

+0

Как я и ожидал. В основном хотелось опубликовать это здесь для записи. – tybro0103

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