我有一个数据结构,其中主题具有子主题,子主题又具有子主题,从原始主题继续向下大约六个级别。这些主题中的每一个都有多个子主题。我正在寻找一种方法来遍历这些数据并带回与每个子主题相关的数据……就好像将我想要的数据拉到“下游”一样。
For example Given a topic structure:
Harry_Potter > Characters > Slitherin_House.videos
(假设slitherin house 有每个成员的子主题,Malfoy、Crabbe 等。)我希望每个成员的视频出现在 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
注意:我还希望能够分配一个子主题,多个父母。例如,角色也有可能被置于“演员”之下。