【问题标题】:How to structure these models associations?如何构建这些模型关联?
【发布时间】:2014-06-04 17:00:28
【问题描述】:

我基本上是在尝试创建一个允许用户跟踪他们正在做什么的应用程序。所以每个用户都会有很多项目。

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

每个对象都有不同的变量(书籍可能有作者和长度,网站可能有 URL、排名等)

如何在 Rails 中设置这些模型?

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

或者有没有更好的方法来设计这个。

Modelling Many Rails Associations

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

更新** 到目前为止,我有:

Projects 
has_one type

Type
belongs_to projects
has_many objects

object
belongs_to type

但我不确定这是否是最好的方法,因为就像我说的那样,每种类型的每个对象都会不同

【问题讨论】:

  • 请展示您到目前为止所做的工作,社区可能会帮助您解决您遇到的问题。但是没有人真的喜欢没有你的努力。
  • 对 SO 的最佳回答来自特定问题 - 所以你会被强硬派否决(只是一个警告):)
  • 我刚刚更新了问题以包括我所拥有的,这样更好吗?
  • 你可以只有两个模型,UserProject。对于不同的项目,你可以有一个project_type 项目模型中的属性来处理它。或者你必须看看 STI
  • 是的 - 无论如何我都在写一个答案,但如果你想知道为什么你被否决了,原因就像科学课一样 - 你需要尽可能具体

标签: ruby-on-rails


【解决方案1】:

从我能读到的内容来看,我推荐这个:

模型

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

#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、排名等)

有两种解释方式

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

我将为您详细介绍这两种方法:

--

已知属性

正如 cmets 中提到的 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 可能需要的各种属性。

【讨论】:

  • 感谢这一切,这无疑让我更清楚了。我想我会选择一个已知的属性。澄清一下,这意味着每种类型的项目都有自己的模型(在文件夹模型/项目中)?然后我将所有属性添加到对象类中,并且只调用适合该特定对象的属性?再次感谢您抽出宝贵的时间让我明白这一点!
  • 没问题先生!我给的推荐是Single Table Inheritance。您应该查看 this site 以了解其工作原理
  • 好的,谢谢。刚刚看了一下-因为您已将“Project::books”放入项目模型中,这是否意味着我不需要像该页面所建议的那样包含这条路线? config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]
  • 是的,我认为它运作良好(我试图在控制台中对其进行全部测试,并且似乎如此)。再次感谢
  • 没问题!我真的为答案感到自豪:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多