如何在所有模型上添加has_many关联

jos*_*hsz 1 ruby activerecord ruby-on-rails polymorphic-associations

现在我有一个初始化器,它执行此操作:

ActiveRecord::Base.send :has_many, :notes, :as => :notable ActiveRecord::Base.send :accepts_nested_attributes_for, :notes

它构建关联就好了,除非我加载一个使用它的视图,第二个加载给我: can't dup NilClass from:

/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2184:in `dup'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2184:in `scoped_methods'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2188:in `current_scoped_methods'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2171:in `scoped?'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2439:in `send'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2439:in `initialize'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/reflection.rb:162:in `new'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/reflection.rb:162:in `build_association'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:423:in `build_record'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:102:in `build'
(my app)/controllers/manifests_controller.rb:21:in `show'
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我这样做是错误的吗?有趣的是,如果我将关联移动到我正在使用的模型上,我不会得到这个错误.我想我必须错误地构建全局关联.

Joh*_*ley 7

您声明您有许多模型,所有模型都需要此关联.如果是我,我会采用创建包含关联的基础模型类的方法,然后让所有其他模型继承它.就像是:

class NotableModel < ActiveRecord::Base

  # Prevents ActiveRecord from looking for a database table for this class
  self.abstract_class = true

  has_many :notes, :as => :notable
  accepts_nested_attributes_for :notes  
end

class Foo < NotableModel
  ...
end

class Bar < NotableModel
  ...
end
Run Code Online (Sandbox Code Playgroud)

在我看来,与使用隐藏在初始化器中的一点元编程相比,这种方法更加自我记录.

  • 这是干的; 您认为重复的是什么? (2认同)
  • @joshsz,这是DRY,远比鸭子冲击ActiveRecord :: Base好得多 (2认同)