Rails: Как определить расширение ассоциации в модуле, который включается в мою модель AR? - PullRequest
5 голосов
/ 04 февраля 2011

У меня есть модуль Blockable, который содержит ассоциации и методы для включения в некоторые другие ActiveRecord классы.

Соответствующий код:

module Blockable
  def self.included(base)
    base.has_many :blocks
  end
end

Я хочу добавитьрасширение ассоциации.Обычный синтаксис (т. Е. Когда я не определяю связь в модуле) выглядит следующим образом:

# definition in Model < ActiveRecord::Base
has_many :blocks do
  def method_name
    ... code ...
  end
end

# usage
Model.first.blocks.method_name

Этот синтаксис не работает при использовании в модуле, который включен в модель AR.Я получаю undefined method 'method_name' for #<ActiveRecord::Relation:0xa16b714>.

Есть идеи, как мне определить определение расширения в модуле для включения в другие классы AR?

Ответы [ 3 ]

7 голосов
/ 31 июля 2013

В Rails 3 есть несколько вспомогательных методов для этого.Этот пример взят из Rails 3 Way, 2nd Edition :

module Commentable
  extend ActiveSupport::Concern
  included do
    has_many :comments, :as => :commentable
  end
end
4 голосов
/ 07 февраля 2011

У меня сейчас что-то похожее работает в моем коде Rails (2.3.8). Я использовал base.class_eval вместо base.has_many:

module Blockable
    self.included(base)
        base.class_eval do
            has_many :blocks do
                def method_name
                    # ...stuff...
                end
            end
        end
    end
end

Вот так - это было много пробелов ...

В любом случае, это работает для меня - надеюсь, это будет работать и для вас!

2 голосов
/ 08 февраля 2011

Argh, я отстой.

У меня была несвязанная ошибка, которая приводила к разрыву расширения ассоциации.

Я проверил, что и мой оригинальный метод, и метод Ксавье Холта работают под Rails 3.0.3:

self.included(base)
  base.has_many :blocks do 
    def method
      ...
    end
  end
end

# OR

self.included(base)
  base.class_eval do 
    has_many :blocks do
      def method
        ...
      end
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...