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

时间:2009-01-13 17:36:31

标签: ruby-on-rails orm data-structures models

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

I've included a mockup to help visual the application.

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

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

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

我尝试将应用程序视为由表单创建并存储在数据库中的数据,并且使用该pov我无法决定如何将属性(字符< => actor)连接到部分(演员,拍摄地点,艺术品)等等)在电影列表中;同时允许属性本身成为相关属性/电影/甚至部分的超链接:点击“steven speilberg”将带您进入一个他正在演出的电影的页面,他导演,制作,编写的电影等。

思想?

6 个答案:

答案 0 :(得分:2)

我建议首先清楚您的数据模型。然后,您可以从每个数据库表的一个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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

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

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