1

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

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

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

除了这些,我不知道其他的要做什么;像“拍摄地点”、“演员”,最重要的是,像“威利旺卡”和“约翰尼德普”这样的属性。

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

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

想法?

4

6 回答 6

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
于 2009-01-13T17:44:56.207 回答
2

从模型 Movie、Actor、FilmLocation 和 Character 开始。电影和演员是多对多的关系(一部电影有很多演员,一个演员演过很多电影)。FileLocation 和 Movie 也是多对多的。角色(威利旺卡)和演员也是多对多的。

于 2009-01-13T17:55:00.820 回答
2

如果这是您第一次进行 Web 开发,那么我建议您从编写一个简单的 Web 应用程序开始,该应用程序仅列出电影并允许您添加、编辑和删除它们。只需存储电影海报/DVD 封面的标题、概要和可能的 URL。然后添加 Actor 并将它们与电影相关联。

创建一个“类似 IMDB”的网站不是一个简单的项目。除了将演员与电影联系起来之外,您还会有很多复杂的关系。演员在电影中扮演角色。你可能想要比这更抽象,说一个人在电影中有工作,这将允许你跟踪诸如导演、制片人、关键点、选角导演之类的事情。

您不仅应该处理您的数据模型,还应该制定有关您希望站点包含什么以及应该按照什么顺序(根据需要)创建这些功能的计划,并采取一些小步骤来实现最终目标。

于 2009-01-13T17:55:47.667 回答
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上面 Role 模型中的关联,是允许角色表连接演员和电影的外键。正如我提出的建模它,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
于 2009-01-13T18:42:44.890 回答
2

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

于 2009-01-14T00:32:29.193 回答
1

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

在编写复杂的应用程序之前牢牢掌握ActiveRecord 关联是很有帮助的。确保您牢记所有关联以及它们在 SQL 表中实际生成的内容。有时它看起来像魔术,而魔术不一定是好事。如果你知道它背后是什么,事情就顺理成章了。

此外,不要害怕放弃所有东西并在试验时重新开始。它是 Ruby,所以很快就可以回到原来的位置。

于 2009-01-13T18:05:36.260 回答