Rails复杂数据库关系

时间:2013-04-19 02:05:52

标签: ruby-on-rails ruby database-design

我正在开展一个由学校,学生和文章组成的项目。当我开始开发我的文章控制器时,我意识到必须有更好的方法来实现我的目标,但我只是没有经验来弄明白。基本上我要做的是让我的用户注册到某所学校。然后,一旦用户登录,他应该能够看到他的学校和类别的所有文章。这是我的设置,任何建议将不胜感激:

school.rb:

class School < ActiveRecord::Base
  has_many :users
  has_many :articles, :through => :users
  attr_accessible :name
end

user.rb:

class User < ActiveRecord::Base
  belongs_to :school
  has_many :articles
  attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :provider, :uid, :school_id
end

category.rb:

class Category < ActiveRecord::Base
  attr_accessible :name
  has_many :articles
  accepts_nested_attributes_for :articles
end

article.rb:

class Article < ActiveRecord::Base
  attr_accessible :body
  belongs_to :category
  belongs_to :user
end

这看起来像是一个很好的设置来实现我的目标吗?谢谢你提前。

2 个答案:

答案 0 :(得分:1)

accepts_nested_attributes_for :articles感觉像是一个错误。除此之外,假设用户正在创建文章,那对我来说还不错。

我认为用户的文章需要考虑几个问题。如果用户......文章会发生什么?

  • 删除他/她的帐户
  • 转学校
  • 完全毕业学校

也许出于这些原因,学校应该直接发表文章,而不是通过用户。但取决于你希望它如何工作。


您可能还想重新考虑与类别和文章的1对多关系。通常,它更容易使用标签系统,在工作和类别之间具有多对多关系。

想象一下,如果这篇文章是关于货运的风力回归。它可以属于国际商业和技术类别。


编写一些关于您希望类如何工作的测试,并指导您的设计细节。

答案 1 :(得分:1)

虽然一切看起来都不错,但我建议将文章直接链接到学校和用户。所以你最终会得到类似的东西:

# school.rb
has_many :users
has_many :articles

# user.rb:
belongs_to :school
has_many :articles

# category.rb:
has_many :articles

# article.rb:
belongs_to :category
belongs_to :user
belongs_to :school

从建模的角度来看,将文章直接链接到学校更有意义。目前,您的结构表明文章属于其用户目前所属的学校;虽然这通常可行,但从长远来看,这可能会让你最终付出代价。

鉴于这听起来像是用户浏览学校文章的主要活动之一,它也会使您的应用加载这些文章的过程变得复杂。根据您当前的结构,它将采取以下步骤:

  1. 找到当前用户的学校。
  2. 查找属于该学校的每个用户。
  3. 查找每个用户撰写的每篇文章。
  4. 将文章直接链接到学校会削减第二步,这将使您的表现自由增加,特别是如果您收到大量用户和文章。