トピックにサブトピックがあり、サブトピックにもサブトピックがあり、元のトピックから約 6 レベル下がっているデータ構造があります。これらの各トピックには、複数のサブトピックがあります。このデータをトラバースして、各サブトピックに関連するデータを戻す方法を探しています...「下流」に必要なデータをプルするかのように。
For example Given a topic structure:
Harry_Potter > Characters > Slitherin_House.videos
(スリザリン ハウスには、各メンバー、マルフォイ、クラッブなどのサブトピックがあると仮定します。) 各メンバーのビデオを、Slitherin_House、Characters、および Harry_Potter (それぞれの先祖) のビデオ リストに表示する必要があります。
AncestryとActs As Treeに出くわし、コードを読み、それらを使用してみましたが、子にアクセスしてデータをプルするのではなく、物事の先祖側に重点を置いているようです。
私も協会を使ってみました
has_many :through, and has_and_belongs_to_many
しかし、機能するトラバーサル システムを作成する試みには成功していません。そして、これを行う方法について頭を完全に包むことができないようです。
そのような苦境を考えると、何をすべきかについて誰かアイデアや提案はありますか? または、そのような機能を提供する宝石を知っていますか?
リレーションシップ クラスとモデル: (ストリームのように流れる必要があるため)
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
トピック モデル
# == 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
注: また、サブトピック、複数の親を割り当てられるようにしたいと考えています。そのため、たとえば、キャラクターが「アクター」の下に配置される可能性もあります。