2

我有一個數據結構,其中的主題有子主題,它們也有子主題,從原始主題繼續向下關於六個級別。每個主題都有多個子主題。 我正在尋找一種方法來遍歷這些數據,並從每個子主題中提取附屬的數據......就像拉取我想要的「下游」數據一樣。遍歷Rails應用程序中的複雜數據結構

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

(假設slitherin房子對於每個成員,馬爾福,克拉布等的副標題)我要爲每位成員的視頻出現在Slitherin_House,字符和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 

注:我也希望能夠指定一個副主題,多的父母。例如,角色可能會置於「演員」之下。

+0

你可以顯示你的模型和表格的來源? – 2012-04-08 17:57:18

+0

添加主題模型和流(關係)模型/表 我可以添加主題表以及它雖然分散在多個遷移,所以我添加了註釋版本 – 2012-04-08 19:29:33

回答

0

如果你想以簡單的方式設置它,我會去遞歸關係。這意味着一個主題可以屬於另一個話題(嵌套)

話題的數據庫模型將如下所示:

主題

  • ID
  • topic_id
  • 標題

該模型將是:

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

現在,如果你有一個主題。您可以通過.topic及其子女.topics訪問其父母。沒有父母的主題是頂層節點,沒有孩子的主題是末端節點。

+0

對不起,我忘了提及,我也想有多個這就是爲什麼我要追蹤has_many:through和h_a_b_t_m數據模型的原因。 – 2012-04-08 19:34:51