2014-06-30 85 views
1

我的應用程序有3種類型具有以下屬性的詩句:line_oneline_twoline_threeline_fourline_fiveactivesex如何設計我的車型

此外,TraitVerses和MessageVerses也屬於一個類別。

類別具有name,active,sexfill_the_blank屬性。

TraitVerses屬於TraitCategory,MessageVerses屬於MessageCategory。 IntroVerses不屬於某個類別。

我該怎麼做Rails 4應用程序?

我正在考慮使用STI的詩句和類別,但後來我沒有設法使關聯工作。任何提示?

回答

0

@ RichPeck的回答讓我更好地瞭解STI,這就是我最終做的:

IntroVerse,TraitVerse和MessageVerse繼承了Verse模型。 TraitVerse和MessageVerse有belongs_to協會:

class MessageVerse < Verse 
    belongs_to :category 
end 

class TraitVerse < Verse 
    belongs_to :category 
end 

另一方面,TraitCategory和MessageCategory從類別模型繼承。他們有一個has_many協會,像這樣:

class TraitCategory < Category 
    has_many :trait_verses, :foreign_key => "category_id" 
end 

class MessageCategory < Category 
    has_many :message_verses, :foreign_key => "category_id" 
end 

我還添加了type場雙方的詩句和類別表的不同類型的詩句/類別區分。詩句表也得到了category_id場感謝t.belongs_to

class CreateVerses < ActiveRecord::Migration 
    def change 
    create_table :verses do |t| 
     t.string :type 
     t.string :line_one 
     t.belongs_to :category 

     t.timestamps 
    end 
    end 
end 

該解決方案似乎運作良好。

1

STI

你需要use an STIcategoriesverses - 基本上是基於其他任何模型,可以轉移到了性病,防止溼顯影:


配置

#config/application.rb 
config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')] 

這將允許你保持你的模型目錄清潔 - 讓你的繼承模式在一個單獨的文件夾中,這樣你就不會在將來感到困惑

-

模式

#app/models/verses/trait.rb 
Class Trait < Verse 
    belongs_to :category 
end 

#app/models/verses/message.rb 
Class Message < Verse 
    belongs_to :category 
end 

#app/models/verse.rb 
Class Verse < ActiveRecord::Base 
    ... 
end 

這將允許你打電話喜歡的Message.all,這實際上會檢索所有Verse記錄與typeMessage的:

#verses table 
id | type | category_id | line_1 | line_2 | line_3 | active | sex | created_at | updated_at 

-

分類

你爲什麼不只是使用單一Category模式,用3個不同類別內:

#app/models/verses/trait.rb 
Class Trait < Verse 
    belongs_to :category 
end 

#app/models/category.rb 
Class Category < ActiveRecord::Base 
    has_many :traits 
end