Requêtes Arel, Joins et Rails
J'ai été bloqué sur un problème récemment, pour un peu de temps et a trouvé le chemin de mon Arel qui ressemble, il devrait me permettre de faire OU dans mes requêtes.
Comme un point de départ j'avais besoin pour convertir un Rails 3, la requête pour Arel et c'est là que j'ai couru dans des problèmes.
La suite de la portée et de la requête fonctionne comme je l'espère. Il me donne les demandes associées à un utilisateur en particulier des annonces.
#in the Request class
scope :responder, lambda { |user| joins(:ad).where(:ads => { :user_id => user }) }
Request.responder(303).to_sql
=> "SELECT \"requests\".* FROM \"requests\" INNER JOIN \"ads\" ON \"ads\".\"id\" = \"requests\".\"ad_id\" WHERE (\"ads\".\"user_id\" = 303)"
Selon doco sur le Arel github page et Railscast, 215, je devrais être capable de faire quelque chose comme ce qui suit à reproduire la requête avec Arel
requests = Request.arel_table
ads = Ad.arel_table
where(requests.join(ads).on(ads[:id].eq(requests[:ad_id])))
Cela entraîne une erreur
TypeError: Cannot visit Arel::SelectManager
Je pouvez effectuer les opérations suivantes dans la console si
r = Request.arel_table
a = Ad.arel_table
r.join(a).to_sql
=> "SELECT FROM \"requests\" INNER JOIN \"ads\" "
De sorte qu'il ressemble à former la requête SQL, mais quand vous mettez que dans un cas
Request.where(r.join(a)).to_sql
J'ai le
TypeError: Cannot visit Arel::SelectManager....
J'ai essayé de faire d'autres Arel actions dans le où et ça fonctionne (par exemple)
Request.where(r[:status].eq(nil)).to_sql
=> "SELECT \"requests\".* FROM \"requests\" WHERE (\"requests\".\"status\" IS NULL)"
C'est un peu au-delà de mon enfance rails/ruby connaissances. Des idées?
Merci d'avance.
source d'informationauteur Jason
Vous devez vous connecter pour publier un commentaire.
À faire OU est en rails 3, découvrez MetaWhere. Il y a une belle railscast: http://railscasts.com/episodes/251-metawhere-metasearch
Le plus de réponse ici, c'est que, malgré la fantaisie, inspirant exemple ici:
http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/
...Active Record n'est pas réellement en charge l'intégralité du Arel fonctionnalité. Au moins, pas par le biais de relations ou étendues. Vous pouvez créer n'importe quel (le plus) les requêtes en Arel, mais à la fin vous allez utiliser:
Techniquement, il y a toujours un ".to_a" la méthode, mais elle ne renvoie pas ActiveRecord instances de modèle, et c'est obsolète.
{UPDATE}
http://erniemiller.org/projects/squeel/ est la meilleure chose à ActiveRecord, jamais. Tout ce que Arel trucs, réalisé.
Vous pouvez utiliser
join_sources.first
surArel::SelectManager
et de les transmettre à des jointuresJe ne suis pas Arel expert, mais je pense que vous voulez combiner la rejoindre et où les étendues au lieu d'inclure l'un dans l'autre. Ainsi, au lieu de
essayer (par exemple):
La solution la plus flexible que j'ai trouvé jusqu'à présent est quelque chose comme ce qui suit:
Le pouvoir, c'est que vous pouvez mélanger et assortir avec vos autres étendues