web-dev-qa-db-fra.com

Rails: requête ActiveRecord basée sur la valeur d'association

J'ai 2 modèles. Report et Server qui ont une relation d'appartenance et de has_many. J'ai créé une méthode d'accesseur en utilisant delegate qui permet à un Report de trouver son Server.company_id Associé. Maintenant, je veux exécuter une requête sur Report qui me permet de trouver tous les Report qui sont associés à un Server spécifique qui a un attribut company_id Spécifique de 5.

Voici mes deux modèles. Et oui, je sais que la requête actuelle ne fonctionnera pas puisque Report n'a pas d'attribut company_id.

Et non, je ne veux pas stocker company_id À l'intérieur de Report car ces informations n'appartiennent pas à Report.

Signaler

class Report < ActiveRecord::Base

 belongs_to :server

 delegate :company_id, :to => :server

    class << self

        def method(url, base_url)
            #Report.where(company_id: 5)
        end
    end

end

Serveur

class Server < ActiveRecord::Base

 attr_accessible :company_id

 has_many :reports

end
52
user2158382

Vous pouvez effectuer une requête comme celle-ci:

Report.joins(:servers).where(:servers => {:company_id => 5})

Pour moi, c'est la solution la plus propre au SQL brut.

77
KappaNossi

J'utilise Rails 4.1.7 et la réponse acceptée n'a pas fonctionné pour moi. Ce qui a fonctionné est

Report.joins(:server).where(:servers => {:company_id => 5})

Notez que la différence est la clé dans la clause where est pluralisée (: serveurs au lieu de: serveur)

39
Joseph Gill

Cela devrait faire l'affaire

Report.joins(:server).where('servers.company_id = ?', 5)

vous pouvez également ajouter une portée pour cela comme si

scope :with_company_id, lambda {|id| joins(:server).where('servers.company_id = ?', id) }

puis écrire

Report.with_company_id(5)
18
Patrick Oscity