2

Ich habe eine Datenstruktur, in der Topics Unterthemen haben, die wiederum Unterthemen haben, die vom ursprünglichen Topic über sechs Ebenen ausgehen. Jedes dieser Themen hat mehrere Unterthemen. Ich bin auf der Suche nach einer Möglichkeit, diese Daten zu durchlaufen und Daten aus den einzelnen Unterthemen zurückzubringen ... als ob ich die Daten, die ich will, "downstream" ziehe.Traversierung komplexer Datenstrukturen in einer Rails-Anwendung

For example Given a topic structure: 
Harry_Potter > Characters > Slitherin_House.videos 

(dass slitherin Hauses hat für jedes der Mitglieder untergeordnete Themen Unter der Annahme, Malfoy, Crabbe, etc.) Ich mag die Videos für jedes der Mitglieder in den Videolisten für Slitherin_House, Charaktere erscheinen, und Harry_Potter (jeder der Vorfahren).

Ich habe mich umgesehen und stolperte über Ancestry und Acts As Tree und lesen Sie den Code und versuchte meine Hand bei der Verwendung von ihnen, aber sie scheinen mehr auf der Vorfahrseite der Dinge orientiert, im Gegensatz zum Zugreifen und ziehen Daten aus der Kinder.

Ich habe meine Hand auch versucht, die Assoziationen an mit

has_many :through, and has_and_belongs_to_many 

aber in meinen Versuchen, ein Arbeits Traversal System zu schaffen, nicht erfolgreich gewesen. Und ich scheine nicht fertig zu sein, meinen Kopf darum zu drehen, wie man das macht.

Hat jemand irgendwelche Ideen oder Vorschläge, was zu tun ist angesichts einer solchen misslichen Lage? Oder wissen Sie von Edelsteinen, die solche Funktionalität bieten?

Beziehungsklasse & Modell:

class CreateStreams < ActiveRecord::Migration 
    def change 
    create_table :streams do |t| 
     t.integer :downstream_id 
     t.integer :upstream_id 

     t.timestamps 
    end 

    add_index :streams, :downstream_id 
    add_index :streams, :upstream_id 
    add_index :streams, [:downstream_id, :upstream_id], unique: true 
    end 
end 





# == Schema Information 
# 
# Table name: streams 
# 
# id   :integer   not null, primary key 
# downstream_id :integer 
# upstream_id :integer 
# created_at :datetime  not null 
# updated_at :datetime  not null 
# 

class Stream < ActiveRecord::Base 
    attr_accessible :downstream_id 

    belongs_to :subsidiary, class_name: "Topic" 
    belongs_to :tributary, class_name: "Topic" 

    validates :downstream_id, presence: true 
    validates :upstream_id, presence: true 

end 

Topic Modell

# == Schema Information 
# 
# Table name: topics 
# 
# id   :integer   not null, primary key 
# name  :string(255) 
# created_at :datetime  not null 
# updated_at :datetime  not null 
# slug  :string(255) 
# wiki  :string(255) 
# summary :string(255) 

class Topic < ActiveRecord::Base 
    extend FriendlyId 
    attr_accessible :name, :wiki, :summary 

    has_many :streams, foreign_key: "downstream_id", dependent: :destroy 
    has_many :tributaries, through: :streams, source: :tributary 
    has_many :reverse_streams, foreign_key: "upstream_id", 
          class_name: "Stream", 
          dependent: :destroy 
    has_many :subsidiaries, :through => :reverse_streams, source: :subsidiary 


    friendly_id :name, use: :slugged 

    validates :name, presence: true, length: { maximum: 50 }, 
        uniqueness: { case_sensitive: false } 

    def downstream?(other_topic) 
    streams.find_by_downstream_id(other_topic.id) 
    end 

    def flow!(other_topic) 
    streams.create!(downstream_id: other_topic.id) 
    end 

    def dam!(other_topic) 
    streams.find_by_downstream_id(other_topic.id).destroy 
    end 
end 

Note (wie es wie ein Strom fließen soll): Ich möchte auch in der Lage sein, eine subtopic zuweisen, mehrere Eltern. So könnten beispielsweise auch Charaktere unter "Actors" platziert werden.

+0

Können Sie die Quelle Ihrer Modelle und Tabellen anzeigen? –

+0

Hinzugefügt Thema Modell und Stream (Beziehung) Modell/Tabelle Ich kann die Topic Tabelle auch hinzufügen, obwohl es über mehrere Migrationen verteilt ist, so fügte ich die kommentierte Version –

Antwort

0

Wenn Sie dies auf eine einfache Weise einrichten möchten, würde ich für eine rekursive Beziehung gehen. Das bedeutet, ein Thema zu einem anderen Thema gehören kann (verschachtelten)

Das Datenbankmodell des Themas aussehen würde:

Thema

  • id
  • topic_id
  • Titel

das Modell wäre dann:

class Topic < ActiveRecord::Base 
    belongs_to :topic 
    has_many :topics 
end 

Jetzt, wenn Sie ein Thema haben. Sie können auf seine Eltern zugreifen, indem Sie .topic und seine Childs mit .topics. Ein Topic ohne Eltern ist ein Toplevel und ein Topic ohne Childs ist ein Endknoten.

+0

Sorry, ich vergaß zu erwähnen, dass ich auch mehrere haben möchte Eltern, weshalb ich nach den Datenmodellen has_many: through und h_a_b_t_m ging. –