2009-07-03 5 views
1

Ich hoffe, dies wird ein einfach ein :) Ich habe stundenlang herum Füllung mit den has_many Spielmöglichkeiten versuchen, dies zu emulieren:Recreating diese benutzerdefinierte Abfrage has_many mit

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}) 

Es ist im Grunde eine polymorphe Beitreten, so gibt es die Tabelle component_instances, die als zentrale Struktur fungiert und verschiedene Arten von Dingen davon hängt. Es ist ein verschachtelter Satz (nicht das ist in diesem Fall wichtig).

Das Problem scheint zu sein, dass has_many mir nicht erlaubt, die Join-Bedingungen zu manipulieren. Und ich kann die Fremdschlüsselverbindungsbedingung, die automatisch vorgenommen wird, nicht aufheben.

Der obige Code funktioniert, aber ich möchte Bereiche für die Ergebnisse verwenden, und das ist nicht mit einer benutzerdefinierten Abfrage möglich.

Jede Hilfe wäre sehr dankbar :)

Cheers,

Brendon

Antwort

0

Lol, schlafen auf es gab mir die Antwort:

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 

die Organisationen, die mit der Verbindung durch parent_id Recht Kinder sind, war ich bezieht sich nur auf sie in der falschen Weise, aber AR hat keine Fehler ausgelöst :)

0

Sie dies mit dem tun: durch Option.

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

Danke für die Leitung Michael, am Ende dieses gearbeitet:

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 

aber es ist ein wenig lückenhaft wie die: PAGE_SET Methode tatsächlich etwas völlig falsch zurückgibt. Im Idealfall sollte es sich selbst zurückgeben, aber ich musste: parent_id als Fremdschlüssel verwenden, damit die aus der has_many-Seiten-Deklaration generierte SQL korrekt war (mit: id wäre der richtige Weg, aber dann vermasselt die: pages-Methode :) Verstand hat sich nicht richtig verstanden, was hier vor sich geht, aber zumindest funktioniert es und das Scoping funktioniert auch :)

Danke für die Hilfe, und wenn Sie irgendwelche Erklärungen haben, warum das funktioniert, lassen Sie es mich wissen :)

Verwandte Themen