0

我有樹模型會議,客戶端,聯繫人。在這種情況下如何做到最好?

當我創建新會議時,我可以選擇客戶或聯繫人,但如何更好地存儲此結構和關聯? !會議桌中的用例client_id和contact_id不好。

回答

1

我們假設有人(創建者)可以創建一個會議。創作者可能是客戶或聯繫人。

爲此你需要在你的會議桌的「creator_type」和「creator_id」列第一,所以加用script/rails generate migration AddTypeToMeetings

然後編輯一樣遷移文件的遷移:

class AddTypeToMeetings < ActiveRecord::Migration 
    def self.up 
    add_column :meetings, :creator_id, :integer 
    add_column :meetings, :creator_type, :string 
    end 
end 

其次,你必須適應你的機型:

meeting.rb

class Meeting < ActiveRecord::Base 
    # polymorphic association 
    belongs_to :creator, :polymorphic => true 

end 

client.rb

class Client < ActiveRecord::Base 
    has_many :meetings, :as => :creator 
end 

contact.rb

class Contact < ActiveRecord::Base 
    has_many :meetings, :as => :creator 
end 

如何使用:

@my_meeting = Meeting.new 

@my_meeting.creator = @my_client 
# or if you want a contact: 
@my_meeting.creator = @my_contact 

你可以閱讀更多關於達此多態關聯:

+0

西蒙感謝您的回答,但我怎麼能存儲 「ID」 這個對象:?!客戶端或諮詢creator_type只保存類型,是嗎? – 2011-05-17 16:19:40

+0

據我所知,creator_type保存班級名稱,但您可以這樣做:'@ my_meeting.creator.is_a?(Client)'或'@ my_meeting.creator_is_a?(Contact)' – sled 2011-05-17 16:30:00

+0

對不起,您需要'creator_id'列也是如此。我編輯了我的答案;) – sled 2011-05-17 16:31:22