2009-07-03 7 views
1

J'espère que ce sera facile d'un :) J'ai la farce pendant des heures à jouer avec les options de has_many essayer d'imiter ceci:Recréer cette requête personnalisée à l'aide has_many

has_many :pages, :finder_sql => %q(SELECT * FROM `pages` LEFT OUTER JOIN `component_instances` ON `component_instances`.instance_id = `pages`.id AND `component_instances`.instance_type = 'Page' WHERE `component_instances`.parent_id = #{id}) 

Il est essentiellement un polymorphes joint donc il y a la table component_instances qui agit comme une structure centrale et a différents types de choses qui pendent. C'est un ensemble imbriqué (pas ce qui compte dans ce cas).

Le problème semble être que has_many ne me permet pas de manipuler les conditions de jointure. Et je ne peux pas annuler la condition de jointure de clé étrangère qui est faite automatiquement.

Le code ci-dessus fonctionne mais je souhaite utiliser des étendues sur les résultats, ce qui n'est pas possible avec une requête personnalisée.

Toute aide serait grandement appréciée :)

Cheers,

Brendon

Répondre

0

Lol, dormir sur elle m'a donné la réponse:

class PageSet < ActiveRecord::Base 

    unloadable 

    set_table_name "component_instances" 

    has_many :children, :foreign_key => :parent_id, :class_name => 'PageSet' 
    belongs_to :instance, :polymorphic => true, :dependent => :destroy 
    has_many :pages, :through => :children, :source => :instance, :source_type => 'Page' 

end 

les entités avec le lien par id_parent sont à juste titre les enfants, j'étais juste se référant à eux dans le mauvais sens, mais AR n'a pas soulevé d'erreurs :)

0

Vous pouvez le faire avec: grâce à l'option.

has_many :pages, :through => :component_instances, :source => :parent, :source_type => 'Page' 
0

Merci pour le rôle principal Michael, à la fin cela a fonctionné:

has_one :page_set, :foreign_key => :parent_id 
    belongs_to :instance, :polymorphic => true, :dependent => :destroy 
    has_many :pages, :through => :page_set, :source => :instance, :source_type => 'Page', :extend => LearningCaveFilterExtension 

mais il est un peu peu précis comme: méthode PAGE_SETi retourne en fait quelque chose de complètement faux. Idéalement, il devrait retourner self mais je devais mettre: parent_id comme clé étrangère afin que le SQL généré à partir de la déclaration de pages has_many soit correct (using: id serait la bonne façon mais ensuite ça viderait la méthode: pages. l'esprit n'a pas tout à fait compris ce qui se passe ici, mais au moins cela marche et fonctionne aussi :)

Merci pour l'aide, et si vous avez des explications sur la raison pour laquelle cela fonctionne, s'il vous plaît faites le moi savoir :)

Questions connexes