2012-03-11 3 views
2

У меня есть 3 модели и полиморфные отношения. Сообщение:Упростить код в моделях

#models/post.rb 

class Post < ActiveRecord::Base 

    after_create :create_vote 

    has_one :vote, :dependent => :destroy, :as => :votable 

    protected 
    def create_vote 
     self.vote = Vote.create(:score => 0) 
    end 
end 

Комментарий:

#models/comment.rb 

class Comment < ActiveRecord::Base 

    after_create :create_vote 

    has_one :vote, :dependent => :destroy, :as => :votable 

    protected 
    def create_vote 
     self.vote = Vote.create(:score => 0) 
    end 
end 

Vote (полиморфный)

#models/vote.rb 
class Vote < ActiveRecord::Base 
belongs_to :votable, :polymorphic => true 
end 

Как вы можете видеть, у меня есть одни и те же функции обратного вызова. Как это проще? Если я сделаю модуль с обратным вызовом, это правильно?

ответ

2

Да, вы можете определить модуль, содержащий те же повторяющиеся методы, но при включении этого модуля вам также необходимо будет определить все макросы ActiveRecord.

Это может выглядеть примерно так:

module VoteContainer 
    def self.included(base) 
    base.module_eval { 
     after_create :create_vote 
     has_one :vote, :dependent => :destroy, :as => :votable 
    } 
    end 

    protected 
    def create_vote 
    self.vote = Vote.create(:score => 0) 
    end 
end 

class Comment < ActiveRecord::Base 
    include VoteContainer 
end 
+0

ок. Спасибо. Я создам модуль. – Mike