如何构建这些模型关联?

时间:2014-06-04 08:31:43

标签: ruby-on-rails

我基本上是在尝试创建一个允许用户跟踪他们正在处理的内容的应用。所以每个用户都会有很多项目。

现在每个项目都可以有一定数量的类型,例如视频,网站,文章,书籍等,每种类型的项目都有许多对象(即视频项目将列出他们正在处理的所有视频,书籍项目可能有他们阅读的书籍列表)。

这些对象中的每一个都有不同的变量(书籍可能有作者和长度,网站可能有URL,等级等)。

如何在轨道中设置这些模型?

所以基本上我会将我的项目模型与我的类型模型分开(所以项目has_one类型和类型belongs_to项目)然后为每个不同类型分别有4个独立的对象模型(即objectsite)?

或者有更好的方法来设计它。

Modelling Many Rails Associations

我读到了这个问题,我认为这可能与我想要做的类似,但我并不完全确定,因为我不完全理解它。

UPDATE ** 到目前为止,我有:

Projects 
has_one type

Type
belongs_to projects
has_many objects

object
belongs_to type

但我不确定这是不是最好的方法,因为我说每种类型的每个对象都会有所不同

1 个答案:

答案 0 :(得分:2)

从我可以自己阅读的内容中,我建议:

<强>模型

  

所以每个用户都会有很多项目。

#app/models/project.rb
Class Project < ActiveRecord::Base
   belongs_to :user
end

#app/models/user.rb
Class User < ActiveRecord::Base
   has_many :projects
end

<强>瓦尔

  

这些对象中的每一个都有不同的变量(书籍可能有   作者和长度以及网站可能有URL,等级等。)

有两种方法可以解释这个

首先,如果您知道您的不同对象需要哪些详细信息,您可以将它们作为属性包含在各自的数据表中。如果您不知道,您将不得不使用另一个表来填充它们。

我将为您详细说明这两种方法:

-

已知属性

在评论中提及Pavan时,您可能会因STI (Single Table Inheritance)而受益:

#app/models/project.rb
Class Project < ActiveRecord::Base
   belongs_to :user
   has_many :books, class_name: "Project::Books"
   has_many :folders, class_name: "Project::Folders"
end

#app/models/object.rb
Class Object < ActiveRecord::Base
   #fields - id | type | project_id | field1 | field2 | field3 | field4 | created_at | updated_at
   belongs_to :project
end

#app/models/project/book.rb
Class Book < Object
   ... stuff in here
end

这将允许您致电:

project = Project.find(params[:id])
project.books.each do |book|
   book.field1
end

-

未知属性

#app/models/project.rb
Class Project < ActiveRecord::Base
   has_many :objects
end

#app/models/object.rb
Class Object < ActiveRecord::Base
   belongs_to :project
   has_many   :options
end

#app/models/option.rb
Class Option < ActiveRecord::Base
   #fields - id | object_id | name | value | created_at | updated_at
   belongs_to :object
end

这将允许您致电:

project = Project.find(params[:id])
project.objects.first.options.each do |option|
   option.name  #-> outputs "name" of attribute (EG "length")
   option.value #-> outputs "value" of attribute (EG "144")
end

这意味着您可以使用option填充objects可能需要的各种属性。