Использование области по умолчанию в Rails имеет _много отношений

Допустим, у меня есть следующие классы

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_supportingиSolarSystemhas_many :planets. Я хотел бы определить мои отношения has _many, чтобы, когда я запрашиваю solar_systemдля всех связанных planets, область life_supportingприменялась автоматически. По сути, я хотел бы solar_system.planets == solar_system.planets.life_supporting.

Требования

  • Я не хочу изменить scope :life_supportingв Planetна

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

  • Я также хотел бы предотвратить дублирование, не добавляя кSolarSystem

    has_many :planets, :conditions => ['distance_from_sun > ?', 5], :order => 'diameter 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.life_supporting_planetsвезде, где бы вы использовали solar_system.planets.

Ни один из них не отвечает на вопрос, поэтому я просто помещаю их здесь в качестве обходного пути, если кто-то еще столкнется с этой ситуацией.

74
задан Aaron 8 March 2017 в 04:15
поделиться