2013-04-23 52 views
0

我正在构建一个每日交易应用程序,以更好地学习Ruby on Rails。Rails有很多,属于

关于M.哈特利教程,我了解了模型及其关系的概念(微博属于用户,用户has_many微博)。

但是我不确定如何在日常交易项目中付诸实践。

我决定为用户提供模型具有不同权限的两件式的用户:

  • admin_user谁可以创建/更新/编辑/删除交易

  • standard_user谁可以看到交易,如果他们发现一个有趣的参与交易

两个用户进入用户数据库

我还决定对交易模型,并走在交易数据库 所以我已深知:

  • 一个admin_user的has_many交易

  • 交易属于一个admin_user

  • standard_user有很多交易(的确他可以参与很多交易)

  • 并且交易不属于展位ard_user,所以我在这里什么都不能说。

我理解的东西正确吗?有可能根据对模型对象的用户不同的关系右侧的类型(在这种情况下:交易)来定义

PS:我想我会用康康舞宝石的独立用户,给他们不同的权限

回答

2

您所描述的最大问题是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入门!

+0

我看到什么用户表的属性如下所示: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

+0

deals_participations表的列确实是您所描述的。每次用户参与交易时都有一行。如果您存储了用户参与的用户交易清单(但是如果您这样做了,则无法查询),这与您所拥有的数据量完全相同。这个“链接表”设计是解决这个问题的标准方法。 – charleyc 2013-04-24 21:14:38

+0

感谢您的回答。我明白。主要的是我需要能够检索数据“哪些交易用户mathieu45(例子)在过去30天参与”为了定制电子邮件给他。我担心查询这个表格将会太长而且效率低下。 – Mathieu 2013-04-25 09:27:19

0

假设每笔交易都与一个admin_user相关联,那么我认为您前三个子弹是正确的。然而,就你的第四个项目符号而言,你可以使用has_many:through或has_and_belongs_to_many来模拟standard_user和deal之间的关系,如Rails guide所述。在后一种情况下,standard_user的has_many关系处理将更改为has_and_belongs_to_many。

至于使用用户子类来定义关系,是的,您可以这样做,但请参阅http://guides.rubyonrails.org/association_basics.html以获得关于此方法的一般性讨论。

皮特

+0

就像一个警告,我发现has_and_belongs_to_many虽然方便,却充满了bug。特别是在复杂的连接上,它有一个错误并创建垃圾SQL的趋势。我已经完全停止使用它来支持'has_many:through'。 – charleyc 2013-04-23 21:27:47

+0

正式注意。非常感谢。来自真实体验的建议总是非常有用! – Mathieu 2013-04-23 21:33:23

+0

@charleyc我看到用户表的属性如下:user_id/user_login/user_password/user_location。我也看到deals表的属性:deals_name,deals_price ...但我不明白我会把什么放在您提到的deals_participations表。该表的属性(列)是什么?如果它们是:deals_participation_id/user_id/deals_id,那么我的行数等于用户数量乘以他们参与的交易数量......这可能是巨大的,并且看起来不太有效。我对deal_participation表属性有错吗? – Mathieu 2013-04-24 20:59:20