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