2017-03-28 6 views
0

Vous essayez d'obtenir le code SQL suivant pour une requête Rails.Arel: Besoin d'aide pour convertir l'instruction SQL en code Arel pour Rails

la requête:

select addr.* 
    from addresses addr 
    join users u 
    on addr.addressable_type = 'User' 
    and addr.addressable_id = u.id 
    join customers c 
    on c.id = u.actable_id 
    and u.actable_type = 'Customer' 
where c.account_id = 1 
    and c.site_contact = 't' 

Ceci est mon code Rails:

# Inside my account.rb model 
def site_addresses 
    a = Address.arel_table #Arel::Table.new(:addresses) 
    u = User.arel_table #Arel::Table.new(:users) 
    c = Customer.arel_table #Arel::Table.new(:customers) 

    # trying to debug/test by rendering the sql. Eventually, I want 
    # to return a relation array of addresses. 
    sql = Address. 
     joins(u). 
     on(a[:addressable_type].eq("User").and(a[:addressable_id].eq(u[:id]))). 
     joins(c). 
     on(c[:id].eq(u[:actable_id]).and(u[:actable_type].eq("Customer"))). 
    where(c[:account_id].eq(self.id).and(c[:site_contact].eq(true))).to_sql 

    raise sql.to_yaml #trying to debug, I'll remove this later 
    end 
end 

Je reçois des erreurs comme "classe inconnue: Arel :: Table". Im ne pas utiliser correctement Arel car le code SQL est valide (je peux courir sur la base de données très bien)

+0

Vous n'avez pas besoin de créer un objet qui représente la table quelque part en premier? Comme: adresse = Arel :: Table.new (: adresse) dans votre méthode site_addresses? – bkunzi01

Répondre

2

Effectuez les opérations suivantes:

a.join(u).on(a[:addressable_type].eq("User")... # Using the arel_table and "join" instead 

J'ai fondé ma réponse du docs:

users.join(photos).on(users[:id].eq(photos[:user_id])) 
+0

Tout d'abord, l'échantillon de code dont vous disposez n'a pas de parenthèse. S'il vous plaît modifier votre réponse pour résoudre ce problème. Deuxièmement, c'est proche de ce dont j'ai besoin, mais maintenant j'ai un objet 'Arel :: SelectManager' mais j'ai besoin de le transformer en objet 'ActiveRecord :: Relation' pour pouvoir renvoyer un tableau d'adresses. Pouvez-vous m'aider? – DJTripleThreat

+0

Oh désolé, je faisais juste remarquer le mais sur le code. Pour utiliser 'ActiveRecord :: Relation', vous pouvez réécrire votre code comme indiqué dans cette réponse: https://stackoverflow.com/questions/42840944/arel-active-relation-from-arelselectmanager-with-join –

+1

Merci! Cela a aidé! – DJTripleThreat