gpt4 book ai didi

ruby-on-rails - 在 `includes` 急切加载上重用范围作为过滤器

转载 作者:行者123 更新时间:2023-12-01 06:34:43 24 4
gpt4 key购买 nike

将其分解为一个最小的示例:

class User < ActiveRecord::Base
has_many :profiles
has_many :addresses, through: :profiles
end

class Profile < ActiveRecord::Base
belongs_to :user
has_many :addresses
end

class Address < ActiveRecord::Base
belongs_to :profile

def self.active_by_date
where(is_active: true).order('updated_at DESC')
end
end

class UsersController < ApplicationController
def index
@users = User.includes(profiles: :addresses)
end
end

假设在上面的 Controller 操作中,我想为每个用户的配置文件预先加载按日期排序的事件地址。我可以这样做:
class User < ActiveRecord::Base
has_many :profiles
has_many :addresses, through: :profiles
has_many :active_addresses_by_date, through: :profiles,
source: :addresses, class_name: Address,
conditions: ['address.is_active = ?', true],
order: 'address.updated_at DESC'
end

class UsersController < ApplicationController
def index
@users = User.includes(profiles: :active_addresses_by_date)
end
end

但是由于我不能重用 active_by_date范围在 Address ,条件和顺序现在存在于两个地方。我想把它干掉,就像在第一个版本中一样,“按日期的事件地址”的概念只存在于 Address 中。模型。理想情况下,我可以调用 @users.each { |user| user.addresses.active_by_date }。不发出任何查询。这在 ActiveRecord 下是否可行,如果可以,我将如何处理?

最佳答案

也许我不明白,但如果你改变 active_by_date 就会发生这种情况。到

  def self.active_by_date
where("addresses.is_active = ?", true).order('addresses.updated_at DESC')
end

是不是可以调用 User.includes(profiles: :addresses).active_by_date ?

关于ruby-on-rails - 在 `includes` 急切加载上重用范围作为过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16240744/

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