我正在使用rails应用程序编写ruby,它将拥有2种不同类型的用户(比如卖家和买家)。我正在考虑使用单表继承,但最终我决定创建两个独立的模型(我认为这是我的更好的解决方案)。
问题是当我尝试创建私人消息模型时(卖家和买家都可以互相联系)。通常我只生成带有3个字段的模型称为消息(from_user_id to_user_id和content)。这在我的情况下不起作用,因为可能有2个用户具有相同的ID(1个卖家和1个买家)。
我正在考虑使用电子邮件来识别发件人和收件人,但电子邮件不是我的主要密钥,所以我想我将无法在邮件模型中使用它作为外键。哦 - 顺便说一下,确保电子邮件在卖家和买家表中都是独一无二的最佳方式(换句话说,用户不能通过一封电子邮件作为卖家和买家加入)
任何想法如何才能优雅地解决我的问题?
答案 0 :(得分:2)
为什么你决定没有一个用户模型?考虑到将这些用户分成两个独立表所引起的所有问题,我将拥有一个用户模型,并将此模型扩展为具有买方模型和卖方模型。
我认为买家或卖家仍然是您的应用程序的用户,这也解决了从用户到另一个用户的消息问题。
class User < ActiveRecord::Base
# Remember to add a "type" column in the users table
end
class Seller < User
end
class Buyer < User
end
现在消息在用户之间,无论是哪种用户。
答案 1 :(得分:1)
您正在寻找的是多态关联。这允许您做的是通过指定ID以及另一个对象的Class,使模型可以通过相同的关系属于多个其他模型。例如,如果买方ID 3向卖家ID 5发送消息,则您的消息表最终将显示如下行:
sender_id = 3
sender_type = Buyer
receiver_id = 5
receiver_type = Seller
要在活动记录中完成此操作,您的模型将如下所示:
class Message < ActiveRecord::Base
belongs_to :sender, :polymorphic => true
belongs_to :receiver, :polymorphic => true
end
class Buyer < ActiveRecord::Base
has_many :sent_messages, :class_name => "Message", :as => :sender
has_many :received_messages, :class_name => "Message", :as => :receiver
end
class Seller < ActiveRecord::Base
has_many :sent_messages, :class_name => "Message", :as => :sender
has_many :received_messages, :class_name => "Message", :as => :receiver
end