覆盖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