Есть ли лучший способ найти ассоциации на уровне класса?

#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 от клиентов к серверам.