2

トピックにサブトピックがあり、サブトピックにもサブトピックがあり、元のトピックから約 6 レベル下がっているデータ構造があります。これらの各トピックには、複数のサブトピックがあります。このデータをトラバースして、各サブトピックに関連するデータを戻す方法を探しています...「下流」に必要なデータをプルするかのように。

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

(スリザリン ハウスには、各メンバー、マルフォイ、クラッブなどのサブトピックがあると仮定します。) 各メンバーのビデオを、Slitherin_House、Characters、および Harry_Potter (それぞれの先祖) のビデオ リストに表示する必要があります。

AncestryActs 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

注: また、サブトピック、複数の親を割り当てられるようにしたいと考えています。そのため、たとえば、キャラクターが「アクター」の下に配置される可能性もあります。

4

1 に答える 1

0

これを簡単な方法で設定したい場合は、再帰的な関係を使用します。これは、トピックが別のトピックに属することができる (ネストされている) ことを意味します。

トピックのデータベース モデルは次のようになります。

トピック

  • ID
  • topic_id
  • 題名

モデルは次のようになります。

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

さて、話題があれば。を実行してその親にアクセスし、 を実行してその子にアクセスでき.topicます.topics。親のないトピックはトップレベルのトピックであり、子のないトピックはエンド ノードです。

于 2012-04-08T18:27:57.867 に答える