-3

我正在尝试向 has_many 关系添加迟来的方法,我不想在构建时这样做(:has_many panties do ... end ),也不想在一定范围内这样做(我希望它在每个 has_many 中工作,或者就此而言,收集协会)。我已经尝试过:

  1. 在 ActiveRecord::Associations::CollectionAssociation 类中包含方法
  2. 在 ActiveRecord::Associations::CollectionProxy 类中包含方法

似乎没有任何效果。我只能跟踪未定义的方法将被传递给类,这不是我想要的。

我想要的结果是这样的:

class Man < ActiveRecord::Base
  has_many :balls
end

class Woman < ActiveRecord::Base
  has_many :breasts
end

# magic to insert methods

Man.new.balls.say_hi #=> "hi jerry"
Woman.new.breasts.say_hi #=> "hi jerry"

如此简单,却又如此困难。AR 中的这种方法代理使得调试变得非常困难。

编辑:

我的目的不是插入更多的业务逻辑,而是为集合添加组合,以便我提取有关集合的信息并在其他地方使用它。我重复一遍,这些信息与业务逻辑无关,而是与一些“隐藏”在集合关联中的活动记录信息有关,例如知道哪个类是子类、父类中的关联名称等。

然后,可以通过 #composite_object 之类的收集方法获得此复合对象,该方法将为我提供此信息。但是我不知道如何在不重新定义关联的情况下插入此方法。

4

2 回答 2

1

您是否考虑过 ActiveRecord::QueryMethods#extending 方法?http://apidock.com/rails/ActiveRecord/QueryMethods/extending

module Belatedly
  def say_hi
    "hi jerry"
  end
end

children = Child.all.extending Belatedly
children.say_hi

class Parent < ActiveRecord::Base
  has_many :children, -> { extending Belatedly }
end

Parent.first.children.say_hi
于 2016-10-04T10:43:25.637 回答
0

您需要为has_manyActiveRecord::Associations::ClassMethods定义一个周围的别名,它通过一个开放模块驻留在其中。

周围的别名将简单地调用旧has_many方法,然后使用define_method添加say_hi

于 2013-05-23T10:11:52.660 回答