正确的模型数据结构? (我的第一个Rails应用程序)

我即将构建我的第一个Ruby on Rails应用程序(首先是xhtml和css之外的任何东西),我正在寻找一些有关模型结构的有用反馈。

我已经包含了一个模型来帮助可视化应用程序。

到目前为止我唯一需要的模型是:
1.一个电影模型(作为主要模型,命名电影,所以URL将看起来像,“sitename.com/movies/1-Willy-Wonka”)
2. 用户模型

除了那些,我不知道该怎么做其他人; 比如’拍摄地点’,’演员’,最重要的是像’willy wonka’和’johnny depp’这样的属性。

我应该制作所有这些模型,甚至是属性吗? 如果是这样,是否可以并且建议让人们将模型创建为属性?

我尝试将应用程序视为由表单创建并存储在数据库中的数据,并且使用该pov我无法决定如何将属性(字符 actor)连接到部分(演员,拍摄地点,艺术品等)内部电影列表; 同时允许属性本身成为相关属性/电影/甚至部分的超链接:点击“史蒂文斯皮尔伯格”将带您进入他所参与的电影的页面,他导演,制作,撰写的电影等。

思考?

我建议首先清楚您的数据模型。 然后,您可以从每个数据库表的一个rails模型开始。 情况并非总是如此,但这是一个合理的起点。

让我们专注于电影和演员:

一些假设:

  • 电影可以与其他实体有多对多的关系
  • 您希望将角色信息存储为演员和电影之间关系的一部分

然后,您可以像这样建模您的关系:

# movies.rb class Movie < ActiveRecord::Base has_many :roles has_many :actors, :through => :roles end # actor.rb class Actor < ActiveRecord::Base has_many :roles has_many :movies, :through => :roles end 

通常,您可以依靠Rails的魔法来处理连接模型,而无需自己创建连接模型。 在这种情况下,我们希望将字符信息存储为连接模型的属性,因此我们明确地创建它。

 # role.rb class Role < ActiveRecord::Base belongs_to :movie belongs_to :actor end 

从模型Movie,Actor,FilmLocation和Character开始。 电影和演员有多对多的关系(电影有很多演员,一个演员在许多电影上工作)。 FileLocation和Movie也是多对​​多的。 角色(Willy Wonka)和演员也是多对多的。

如果这是你在网络开发方面的第一件事,那么我建议你先编写一个简单的网页应用程序,它只列出电影并允许你添加,编辑和删除它们。 只需存储标题,概要以及电影海报/ DVD封面的URL。 然后处理添加Actors并将它们与Movie相关联。

创建一个“类似IMDB”的站点并不是一个简单的项目。 除了将演员与电影联系起来之外,你将会有很多复杂的关系。 演员在电影中有角色。 你可能想要比这更抽象,并说一个人在电影中有工作,这也可以让你跟踪董事,制片人,关键握把,演员导演等事情。

您不仅应该处理数据模型,还要制定计划,了解您希望网站包含哪些内容以及应该根据需要创建这些function的顺序,并采取一些小步骤来实现最终目标。

进一步阐述。 上面列出的模型的迁移可能如下所示:

 class CreateMovies < ActiveRecord::Migration def self.up create_table 'movies' do |t| t.string 'title', :null => false t.timestamps end end def self.down drop_table 'movies' end end class CreateActors < ActiveRecord::Migration def self.up create_table 'actors' do |t| t.string 'first_name', 'last_name', :null => false t.timestamps end end def self.down drop_table 'actors' end end 

下面的movie_idactor_id字段对应于上面角色模型中的belongs_to关联,并且是允许角色表加入演员和电影的外键。 正如我建议的那样, character_name是这种关系的一个属性,因此是角色的一个属性。 是否在character_name中允许NULL是您的调用。 我对NULL很谨慎,但在这种情况下,我允许它,因为人们可以提出这样的论点:在实践中,你经常希望存储一个演员在给定电影中但不知道或不关心角色的事实名称。

 class CreateRoles < ActiveRecord::Migration def self.up create_table 'roles' do |t| t.integer 'movie_id', 'actor_id', :null => false t.string 'character_name' t.timestamps end end def self.down drop_table 'roles' end end 

阅读数据库规范化可能是值得的: http : //en.wikipedia.org/wiki/Database_normalization

一般来说,是的。 我喜欢我的模型尽可能细化。 这使得对不熟悉应用程序并使重用代码更容易的人更加清楚。

在编写复杂的应用程序之前,牢牢掌握ActiveRecord关联是有帮助的。 确保您了解所有关联以及它们在SQL表方面实际生成的内容。 有时它看起来像魔术,魔术不一定是好事。 如果你知道它背后的东西,那么事情就会发生。

此外,不要害怕废弃一切,并在试验时重新开始。 这是Ruby,所以回到你原来的地方不会花很长时间。