utilisant la portée sur une association
J'ai donc eu cette idée folle que j'ai voulu appliquer un champ d'application à une association. C'est ce que j'ai compris, et il semble fonctionner parfaitement:
class Event < ActiveRecord::Base
has_many :races
has_many :bad_races, :conditions => Race.bad_medals_sql, :class_name => "Race"
end
class Race < ActiveRecord::Base
def self.bad_medals_sql
arel_table[:prizes].eq('medals').to_sql
# This returns a string
# "`races`.`prizes` = 'medals'"
end
def self.bad_medals
where(bad_medals_sql)
end
end
Event.includes(:bad_races)
Reloading...
Event Load (0.4ms) SELECT `events`.* FROM `events`
Race Load (0.5ms) SELECT `races`.* FROM `races` WHERE (`races`.event_id IN (1,2,3,4) AND (`races`.`prizes` = 'medals'))
Le problème, c'est que c'est vraiment obtus. Afin d'avoir le champ d'application défini sur la Race (à utiliser d'ailleurs) et de l'utiliser sur l'Événement de l'association, je dois avoir deux méthodes sur la Race. Pour chaque portée.
Je suis sûr que je pourrais envelopper le motif dans un plugin ou quelque chose comme ça, mais je préfère utiliser natif AR/ARel si c'est possible. Toutes les idées pour le faire?
source d'informationauteur jsharpe
Vous devez vous connecter pour publier un commentaire.
Ce code semble trop complexe. En supposant que votre but est d'obtenir tous les événements qui contiennent des courses avec seulement "médailles" pour le prix, ne serait pas un simple
scope
travail?Alors vous pouvez simplement exécuter
Event.bad_races
pour obtenir les mauvaises courses.Plus à jour de façon à exprimer l'étendue de votre association est la suivante:
Vous pouvez utiliser des étendues sur les deux modèles avec fusion méthode. Il est vraiment pratique dans ce cas: