这些Rails模型应该如何关联?

时间:2017-03-23 06:24:45

标签: ruby-on-rails ruby model-associations rails-models

我已经过度思考了这一点,我现在只是感到困惑。

我有一个Rails应用程序,其中包含以下模型:User,Site,Tutorial,TutorialStep。

用户可以创建许多教程,每个教程都有一个站点,每个教程都有很多教程步骤。

我遇到问题的模型是Site。

用户有很多教程,并有许多教程步骤通过教程。教程属于用户,有许多教程步骤,最后教程步骤属于教程。

现在网站应该属于用户和教程,还是仅仅是教程?

4 个答案:

答案 0 :(得分:1)

我会按如下方式构建关系:

class User < ApplicationRecord
  has_many :tutorials
  has_many :sites, through: :tutorials
  ...
end

class Site < ApplicationRecord
  has_many :tutorials
  has_many :users, through: :tutorials
  ...
end

class Tutorial < ApplicationRecord
  has_many :tutorial_steps
  belongs_to :user
  belongs_to :site
  ...
end

class TutorialStep < ApplicationRecord
  belongs_to :tutorial
  ...
end

使Site属于User仅将该网站绑定到单个用户,这意味着多个用户无法在同一网站上放置教程,您必须重复输入同样的网站能够实现这一点,在我看来这不是很好的模型设计,因为如果在现实生活中多个用户在同一个网站上有不同的教程,你希望能够在模型和数据中反映出相同的行为。因此,如果您希望能够引用User中的网站,并引用Site中的用户,我建议在链接它们的表上使用多个关系,即教程表,就像我上面所示。

答案 1 :(得分:0)

用户

has_many :tutorials

站点

has_many :tutorials

教程

has_many :tutorial_steps
belongs_to :user
belongs_to :site

教程需要网站ID和用户ID才能正确地将关联映射到用户和网站

教程表(... user_id,site_id)

答案 2 :(得分:0)

看起来应该是这样,

user.rb

has_many :tutorials
has_many :tutorial_steps, through: :tutorials

site.rb

has_many :tutorials

tutorial.rb

has_many :tutorial_steps
belongs_to :user
belongs_to :site

tutorial_step.rb

belongs_to :tutorial
has_one :user, through: :tutorial
has_one :site, through: :tutorial

希望有所帮助!

答案 3 :(得分:0)

据我所知,您可以使用has_one关系。

has_one:指定与其他类的一对一关联

您可以创建与网站和教程

的has_one关系
  

应用程序/模型/ user.rb

has_many :tutorials,->{ includes :site}
has_many :tutorial_steps, through: :tutorials

包含eager loading技术,可让您随教程关系

一起获取网站
  

应用程序/模型/ tutorial.rb

belongs_to :site
belongs_to :user
has_many :tutorial_steps
  

应用程序/模型/ site.rb

  has_one :tutorial
  

应用程序/模型/ tutorial_step.rb

belongs_to :tutorial