ruby on rails association newbie

这可能被视为rails 3关联错误的重新发布。 但它是我无法理解的东西。 但是好的……继续这个交易……我在这里问了一个与表模式有关的问题。 post是这个表模式结构中的错误 ,查询是:

`CREATE TABLE "pages" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255), "body" varchar(255), "author" varchar(255), "email" varchar(255), "reference" varchar(255), "created_at" datetime, "updated_at" datetime);` 

我被建议我应该为作者创建单独的表,这就是我尝试和搞砸了。 任何人都可以告诉我协会应该如何与我的方案一起工作? 我真的需要很好地理解ROR协会。

编辑-1

这是我的页面迁移代码:

 class CreatePages  true, :limit => 50 t.string :body, :limit =>255 t.string :email, :unique => true, :limit => 50 t.string :reference, :limit => 40 t.timestamps end end def self.down drop_table :pages end end 

这是我的作者迁移:

 class CreateAuthors  true, :null => false, :limit => 50 t.timestamps end end end 

如果我们通过逻辑思考,作者可能有很多页面,页面属于作者。 如果是这种情况,我们可以通过rails关系来表达这一点。

 class Author < ActiveRecord::Base has_many :pages class Page < ActiveRecord::Base belongs_to :author 

为了支持这一点,您需要创建一个迁移以确保您的pages表中有author_id列。 Rails负责其余部分。 您将获得所有关系语义,如:

 my_page.author.email my_page.author.name 

(假设您的Author类具有此类属性)

请注意,如果您的用户是您的作者,则您不一定必须拥有Author类。 如果每个作者都是用户(并且您使用User类进行身份validation和帐户维护),您仍然可以将用户称为类的作者

 class Page < ActiveRecord::Base belongs_to :author, :class_name => "User" 

这可以让你保持好作者的语义,它们是针对你的User类的。

最后要注意的是,如果要在删除作者对象时自动删除与作者关联的任何页面,可以向Author类添加依赖关系

 class Author < ActiveRecord::Base has_many :pages, :dependent => :destroy 

为作者创建一个单独的表可能是一个好主意(虽然如果这对你来说效果很好,并且你没有任何性能问题,你可以保持原样)。

@Marc Talbot已经就如何在Rails模型中设置关联提供了一个很好的答案。 当然,您还需要迁移数据库。 这是做什么的:

  1. 制作一个名为“作者”的表格。 除了主键“id”之外,它还应该有一个名为“name”的字段,以及“email”。 您可以将同一作者在逻辑上始终相同的任何其他字段从“pages”移动到“authors”。
  2. 将整数字段“author_id”添加到“pages”。
  3. 运行“页面”中的现有条目。 对于每个页面,检查作者是否已经在“作者”中。 如果没有,请将作者添加到“authors”,并填写“names”,“email”以及“authors”中的其他字段。 设置“author_id”以引用authors表中的正确ID。
  4. 删除“作者”,“电子邮件”以及“页面”中其他移动的字段。