gpt4 book ai didi

ruby-on-rails-3 - 默认情况下在 Rails has_many 关系上使用范围

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

假设我有以下类(class)

class SolarSystem < ActiveRecord::Base
has_many :planets
end

class Planet < ActiveRecord::Base
scope :life_supporting, where('distance_from_sun > ?', 5).order('diameter ASC')
end

Planet 具有范围 life_supportingSolarSystem has_many :planet。我想定义我的 has_many 关系,以便当我向 solar_system 请求所有关联的 planet 时,会自动应用 life_supporting 范围。本质上,我想要 solar_system.planets == Solar_system.planets.life_supporting

要求

  • 不想想要将Planet中的scope :life_supporting更改为

    default_scope where('distance_from_sun > ?', 5).order('直径 ASC')

  • 我还想通过不必添加到 SolarSystem 来防止重复

    has_many :planets, :conditions => ['distance_from_sun > ?', 5], :order => '直径 ASC'

目标

我想要类似的东西

has_many :planets, :with_scope => :life_supporting

编辑:解决方法

正如 @phoet 所说,使用 ActiveRecord 可能无法实现默认范围。然而,我发现了两个潜在的解决方法。两者都可以防止重复。第一个虽然很长,但保持了明显的可读性和透明度,第二个是辅助类型方法,其输出是显式的。

class SolarSystem < ActiveRecord::Base
has_many :planets, :conditions => Planet.life_supporting.where_values,
:order => Planet.life_supporting.order_values
end

class Planet < ActiveRecord::Base
scope :life_supporting, where('distance_from_sun > ?', 5).order('diameter ASC')
end

另一个更简洁的解决方案是简单地将以下方法添加到 SolarSystem

def life_supporting_planets
planets.life_supporting
end

并在任何需要使用 solar_system.planets 的地方使用 solar_system.life_supporting_planets

都没有回答这个问题,所以我只是将它们放在这里作为其他人遇到这种情况的解决方法。

最佳答案

在 Rails 4 中,Associations 有一个可选的 scope 参数,该参数接受应用于 Relation 的 lambda(参见以下文档) ActiveRecord::Associations::ClassMethods)

class SolarSystem < ActiveRecord::Base
has_many :planets, -> { life_supporting }
end

class Planet < ActiveRecord::Base
scope :life_supporting, -> { where('distance_from_sun > ?', 5).order('diameter ASC') }
end

在 Rails 3 中,有时可以通过使用 where_values_hash 来改进 where_values 解决方法,它可以处理更好的范围,其中条件由多个 where 或通过哈希(这里不是这种情况)。

has_many :planets, conditions: Planet.life_supporting.where_values_hash

关于ruby-on-rails-3 - 默认情况下在 Rails has_many 关系上使用范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11636541/

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