2010-06-25 2 views
0

Мне нужен способ создания методов сбора ассоциаций (в частности, append < <) private. Вот пример:Как создать методы сбора ассоциаций ActiveRecord private

class Foo < ActiveRecord::Base 
    has_many :bars 

    def add_bar (bar) 
    # does something extra first 
    # but still also use the <<, ultimately 
    bars.send(:<<, bar) 
    end 
end 

В принципе, я не хочу какую-либо часть приложения, чтобы использовать < < сам по себе, мне это нужно, чтобы пройти через метод «add_bar». Какие-либо предложения?

спасибо!

ответ

2

private_class_method (не знал, что сам :)). Вы можете попробовать что-то по строкам

class Foo < ActiveRecord::Base 
    has_many :bars do 
    private_class_method :<< 
    end 

    def add_bar (bar) 
    # does something extra first 
    # but still also use the <<, ultimately 
    bars.send(:<<, bar) 
    end 
end 

Не проверял это, см., Если он работает.

+0

благодарит за ответ! что, похоже, не работает. Я получаю «неопределенный метод' << 'для ошибки класса 'Module'. Я также попробовал просто «private: <<» и получил ту же ошибку. Спасибо за помощь! – janechii

1

Создайте прокси-класс, который находится перед ассоциацией и сделает оригинальную ассоциацию конфиденциальной. Вот пример:

class Foo < ActiveRecord::Base 

    has_many :_bars, :class_name => "Bar" 
    private :_weeks 

    class BarsProxy 

    include ::Enumerable 

    def initialize(weeks) 
     @weeks = weeks 
    end 

    def each 
     yield @weeks.each 
    end 

    def create(args = {}) 
     @weeks.create(args) 
    end 

    # Plus whatever other methods you want to use on the collection. 

    end 

    def weeks 
    @weeks ||= WeeksProxy.new(_weeks) 
    end 

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