重写 has_many 关联 getter

2024-04-14

一个用户可以拥有多辆车 -

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

每次我打电话@user.cars它返回的列表cars按默认搜索顺序。

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

class User < ActiveRecord::Base
  has_many :cars, -> { 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方法而不无限循环。

有没有办法从我重写的 getter 内部引用“原始”getter?

Thanks!


使用超级:

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 访问)。在您的情况下,定义访问器和读取器(例如您的情况下的“cars”,可以由 User 访问。 generated_association_methods.instance_methods)。该模块成为您的 User 类的祖先,因此您可以在您自己的 cars 方法中通过“super”访问阅读器方法(cars)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重写 has_many 关联 getter 的相关文章

随机推荐