#ruby-on-rails
#ruby-on-rails
Вопрос:
Вот объекты, с которыми я работаю:
class Client < ActiveRecord::Base
has_many :servers
def self.active
where("updated_at > ?", 1.month.ago)
end
end
class Server
belongs_to :client
end
Я хотел бы иметь возможность получать все серверы, принадлежащие активным клиентам, вот так:
Client.active.servers
Единственный способ, которым я могу это сделать, это:
def Client.servers
Server.where(id: all.collect(amp;:id))
end
Для этого должно быть больше Rails-y!
Ответ №1:
Я полагаю, что нашел то, что вы ищете, и это метод Active Record merge
.
Server.joins(:client).merge(Client.active)
При тестировании, если вы обнаружите конфликт с вашим updated_at
столбцом, обязательно устраните его неоднозначность в своей active
области:
def self.active
where("clients.updated_at > ?", 1.month.ago)
end
Ответ №2:
Вы хотите присоединиться к клиенту с сервера. Что-то вроде этого должно работать:
Server.joins(:client).where('clients.updated_at > ?', 1.month.ago)
Комментарии:
1. Но я хочу иметь возможность использовать методы запроса, определенные в class Client. Если я делаю это таким образом, я либо нарушаю DRY, либо инкапсуляцию (определяя их на сервере).
2. так что нарушайте их. это просто рекомендации. это способ запроса серверов на основе атрибута в таблице соединений. альтернативой является некоторая тупая flat_map от клиентов к серверам.