2

我有一个数据结构,其中主题具有子主题,子主题又具有子主题,从原始主题继续向下大约六个级别。这些主题中的每一个都有多个子主题。我正在寻找一种方法来遍历这些数据并带回与每个子主题相关的数据……就好像将我想要的数据拉到“下游”一样。

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

(假设slitherin house 有每个成员的子主题,Malfoy、Crabbe 等。)我希望每个成员的视频出现在 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 回答