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