Rails has_many属于

时间:2013-04-23 20:35:00

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

我正在构建一个日常交易应用程序,以更好地学习Ruby on Rails。

在M.Hartly教程中,我理解了模型的概念及其关系(微博属于用户,用户有多个微博)。

但是我不知道如何在我的日常交易项目中付诸实践。

我决定为具有不同权限的两类用户的用户建立一个模型:

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

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

两个用户都进入用户数据库

我还决定建立交易模型并进入交易数据库 所以我明白了:

  • 一个admin_user has_many交易

  • 交易属于admin_user

  • standard_user有很多交易(实际上他可以参与很多交易)

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

我理解对了吗?可以根据用户的权利类型定义与模型对象的不同关系(在这种情况下:交易)

PS:我想我会将用户与cancan gem分开,以赋予他们不同的权利

2 个答案:

答案 0 :(得分:2)

您所描述的最大问题是standard_user has_many :deals,但交易不属于standard_user;它们可能同时被许多标准用户使用。这意味着交易不能belong_to标准用户,因为您的交易表中不能有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入门!

答案 1 :(得分: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。

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

皮特