Кроме того, мне было немного трудно понять, что у вас есть «страна», принадлежащая ровно одному клиенту:
Почему бы вам просто не добавить еще одну ассоциацию в вашу модель, чтобы каждый параметр has_many
customer_countries. Таким образом, вы можете пойти
CustomerSetting.find(:all, :joins => :customer_countries, :conditions => ...)
Если, например, у вас есть отношение 1-1 между клиентом и его настройками, вы также можете выбрать через клиентов:
class Customer
has_one :customer_setting
named_scope :by_country, lambda { |country| ... }
named_scope :with_setting, :include => :custome_setting
...
end
, а затем
Customer.by_country('us').with_setting.each do |cust|
setting = cust.customer_setting
...
end
В общем, я считаю гораздо более элегантным использование именованных областей, не говоря уже о том, что области станут методом поиска по умолчанию, а текущий #find API будет устаревшим с будущими версиями Rails.
Кроме того, не слишком беспокойтесь о производительности ваших запросов. Исправляйте только то, что вы на самом деле видите плохо выполняете. (Если у вас действительно есть критический запрос в приложении с высокой нагрузкой, вы, вероятно, в итоге получите #find_by_sql. Но , если это не имеет значения, не оптимизируйте его .