Ruby on rails Rails:如何在包含在AR模型中的模块中定义关联扩展?

Ruby on rails Rails:如何在包含在AR模型中的模块中定义关联扩展?,ruby-on-rails,ruby-on-rails-3,activerecord,associations,Ruby On Rails,Ruby On Rails 3,Activerecord,Associations,我有一个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_

我有一个
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模型中包含的模块中使用时不起作用。我为#获得了一个未定义的方法“method\u name”


知道我应该如何在模块中定义关联扩展以包含在其他AR类中吗?

目前,我的Rails代码(2.3.8)中也有类似的功能。我使用的是
base.class\u eval
而不是
base.have\u many

module Blockable
    self.included(base)
        base.class_eval do
            has_many :blocks do
                def method_name
                    # ...stuff...
                end
            end
        end
    end
end
呼-那是一个很大的空间障碍

不管怎样,这对我来说很有效——希望它也能对你有效

啊,我糟透了

我有一个无关的bug导致关联扩展中断

我已经验证了我的原始方法和Xavier Holt的方法在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

Rails 3为此提供了一些辅助方法。此示例来自:


您的模块看起来很好,只是您的调用似乎不正确<代码>模型.块不应该工作。您正在对一个对象而不是该对象的实例调用它。请尝试
Model.first.blocks.method\u name
。对不起,我举了一个失败的例子。我一直在尝试在一个实例上调用它-我已经更新了我的问题来解决这个问题。谢谢你的关注,并给了我另一个尝试的方法。原来我在别的地方搞砸了,两种方法都奏效了!
module Commentable
  extend ActiveSupport::Concern
  included do
    has_many :comments, :as => :commentable
  end
end