我基本上是在尝试创建一个允许用户跟踪他们正在处理的内容的应用。所以每个用户都会有很多项目。
现在每个项目都可以有一定数量的类型,例如视频,网站,文章,书籍等,每种类型的项目都有许多对象(即视频项目将列出他们正在处理的所有视频,书籍项目可能有他们阅读的书籍列表)。
这些对象中的每一个都有不同的变量(书籍可能有作者和长度,网站可能有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
但我不确定这是不是最好的方法,因为我说每种类型的每个对象都会有所不同
答案 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
可能需要的各种属性。