Giả sử tôi có các lớp học sau
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
có phạm vi life_supporting
và SolarSystem
has_many :planets
. Tôi muốn xác định mối quan hệ has_many của mình để khi tôi yêu cầu một solar_system
cho tất cả các liên kết planets
, life_supporting
phạm vi sẽ tự động được áp dụng. Về cơ bản, tôi muốn solar_system.planets == solar_system.planets.life_supporting
.
Yêu cầu
Tôi không muốn thay đổi
scope :life_supporting
trongPlanet
đểdefault_scope where('distance_from_sun > ?', 5).order('diameter ASC')
Tôi cũng muốn ngăn trùng lặp bằng cách không phải thêm vào
SolarSystem
has_many :planets, :conditions => ['distance_from_sun > ?', 5], :order => 'diameter ASC'
Mục tiêu
Tôi muốn có một cái gì đó giống như
has_many :planets, :with_scope => :life_supporting
Chỉnh sửa: Cách làm việc
Như @phoet đã nói, có thể không đạt được phạm vi mặc định bằng ActiveRecord. Tuy nhiên, tôi đã tìm thấy hai cách giải quyết tiềm năng. Cả hai đều ngăn chặn sự trùng lặp. Phương thức đầu tiên, trong khi dài, duy trì khả năng đọc và tính minh bạch rõ ràng, và phương thức thứ hai là phương thức loại trợ giúp với đầu ra là rõ ràng.
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
Một giải pháp khác gọn gàng hơn rất nhiều là chỉ cần thêm phương pháp sau vào SolarSystem
def life_supporting_planets
planets.life_supporting
end
và sử dụng solar_system.life_supporting_planets
bất cứ nơi nào bạn muốn solar_system.planets
.
Cả hai đều không trả lời câu hỏi vì vậy tôi chỉ đặt chúng ở đây như một giải pháp thay thế nếu bất kỳ ai khác gặp phải tình huống này.