【问题标题】:Rails: How do I define an association extension in a module that gets included in my AR model?Rails:如何在我的 AR 模型中包含的模块中定义关联扩展?
【发布时间】:2011-02-03 23:12:17
【问题描述】:

我有一个 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 #&lt;ActiveRecord::Relation:0xa16b714&gt;

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

【问题讨论】:

  • 您的模块看起来不错,只是您似乎调用不正确。 Model.blocks 不应该工作。您是在一个对象上调用它,而不是在该对象的实例上调用它。试试Model.first.blocks.method_name
  • 对不起,我的例子失败了。我一直试图在一个实例上调用它 - 我已经更新了我的问题来解决这个问题。

标签: ruby-on-rails ruby-on-rails-3 activerecord associations


【解决方案1】:

Rails 3 为此提供了一些辅助方法。这个例子来自The Rails 3 Way, 2nd Edition

module Commentable
  extend ActiveSupport::Concern
  included do
    has_many :comments, :as => :commentable
  end
end

【讨论】:

    【解决方案2】:

    目前,我的 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
    

    唷 - 空格键太多了……

    无论如何,这对我有用 - 希望它也对你有用!

    【讨论】:

    • 感谢您的关注,并为我提供了另一种尝试的方法。原来我在其他地方搞砸了,两种方法都有效!
    【解决方案3】:

    啊,我糟透了。

    我有一个不相关的错误导致关联扩展中断。

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

    【讨论】:

      猜你喜欢
      • 2016-02-24
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 2021-02-13
      相关资源
      最近更新 更多