覆盖has_many关联getter

用户可以拥有几辆车 –

  • User: has_many :cars
  • Car: belongs_to :user

每当我调用@user.cars它都会返回默认搜索顺序中的cars列表。

如果我希望关联在某个任意字段上排序,我可以这样做

 class User  { order :num_wheels } end 

但是,假设我的排序逻辑很复杂,我想重写关联getter来实现我自己的逻辑

我尝试了类似的东西 –

 class User < ActiveRecord::Base has_many :cars def cars # Pretend this is complex logic cars.order(:num_wheels) end end 

然而,这显然是失败的,因为你不能从被覆盖的cars方法中引用原始cars ,而不会无限循环。

有没有办法从我被覆盖的吸气剂中引用“原始”吸气剂?

谢谢!

使用超级:

 class User < ActiveRecord::Base has_many :cars def cars # Pretend this is complex logic super.order(:num_wheels) end end 

当您使用像has_many这样的宏时,Rails会动态创建一个模块(可以通过User.generated_association_methods访问)。在您的情况下,定义访问者和读者(例如您的案例中的“汽车”,可以由用户访问)。 generated_association_methods.instance_methods)。 此模块成为User类的祖先,因此您可以在自己的汽车方法中通过“super”访问读取器方法(汽车)。

根据我的理解,我相信has_many本质上正在做的是:

 Class User < ActiveRecord::Base has_many :cars # is essentially def cars Car.where(user_id: self.id) end end 

因此,当用户想要列出所有汽车时,它仍然是User.cars。 当使用ActiveRecord时,has_many假设汽车的方法名称和相关的外键。

试试这个:

 class User < ActiveRecord::Base has_many :cars def cars Car.where(user_id: id).order(:num_wheels) end end