Rails - 2种用户类型的应用程序设计

时间:2012-03-01 13:52:31

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

我正在使用rails应用程序编写ruby,它将拥有2种不同类型的用户(比如卖家和买家)。我正在考虑使用单表继承,但最终我决定创建两个独立的模型(我认为这是我的更好的解决方案)。

问题是当我尝试创建私人消息模型时(卖家和买家都可以互相联系)。通常我只生成带有3个字段的模型称为消息(from_user_id to_user_id和content)。这在我的情况下不起作用,因为可能有2个用户具有相同的ID(1个卖家和1个买家)。

我正在考虑使用电子邮件来识别发件人和收件人,但电子邮件不是我的主要密钥,所以我想我将无法在邮件模型中使用它作为外键。哦 - 顺便说一下,确保电子邮件在卖家和买家表中都是独一无二的最佳方式(换句话说,用户不能通过一封电子邮件作为卖家和买家加入)

任何想法如何才能优雅地解决我的问题?

2 个答案:

答案 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