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.
Können Sie die Quelle Ihrer Modelle und Tabellen anzeigen? –
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 –