您所描述的最大问题是standard_user has_many :deals
,但交易不属于standard_user;他们可能同时被许多标准用户使用。这意味着交易不能belong_to
standard_user,因为您的交易表中不能有standard_user_id
列(因为您需要任意多列来处理可能参与的任意多个用户)。
为了有这样的多对多关系,您需要一个链接表。下面是Rails的实现这一目标的一种方法:
class DealParticipation < ActiveRecord:Base
#This means the deal_participations table has a standard_user_id key
belongs_to :standard_user
#This means the deal_participations table has a deal_id key
belongs_to :deal
#... more logic goes here ...
end
现在标准用户是这样的:
class StandardUser < ActiveRecord::Base
has_many :deal_participations
has_many :deals, :through => :deal_participations
# ... more logic goes here ...
end
而且您的交易类看起来像:
class Deal < ActiveRecord::Base
has_many :deal_participations
has_many :standard_users, :through => :deal_participations
belongs_to :admin_user
#... more logic goes here ...
end
然后您就需要三个表格:一个用于deals
,一个用于deal_participations
,另一个用于standard_users
(加上管理员用户的东西)。
根据您的需要,您可能还想尝试使用单表继承(STI)使用户和管理用户从一个公共基类派生。你可以阅读更多关于STI here。
我希望有帮助!享受Rails入门!
我看到什么用户表的属性如下所示:USER_ID/USER_LOGIN/USER_PASSWORD/user_location.I也看到了交易表属性:deals_name,deals_price ......但我不明白我放入您提到的deals_participations表中。该表的属性(列)是什么?如果它们是:deals_participation_id/user_id/deals_id,那么我的行数等于用户数量乘以他们参与的交易数量......这可能是巨大的,并且看起来不太有效。我对deal_participation表属性有错吗? – Mathieu 2013-04-24 21:04:13
deals_participations表的列确实是您所描述的。每次用户参与交易时都有一行。如果您存储了用户参与的用户交易清单(但是如果您这样做了,则无法查询),这与您所拥有的数据量完全相同。这个“链接表”设计是解决这个问题的标准方法。 – charleyc 2013-04-24 21:14:38
感谢您的回答。我明白。主要的是我需要能够检索数据“哪些交易用户mathieu45(例子)在过去30天参与”为了定制电子邮件给他。我担心查询这个表格将会太长而且效率低下。 – Mathieu 2013-04-25 09:27:19