gpt4 book ai didi

ruby-on-rails - 覆盖 has_many 关联 getter

转载 作者:行者123 更新时间:2023-12-03 16:12:05 24 4
gpt4 key购买 nike

一个用户可以有几辆车——

  • 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 内部没有它无限循环的方法。

    有没有办法从我被覆盖的 setter/getter 中引用“原始” setter/getter ?

    谢谢!

    最佳答案

    使用 super :

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

    关于ruby-on-rails - 覆盖 has_many 关联 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36782820/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com