ruby on rails association新手

时间:2012-02-12 14:49:23

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

这可能会被视为rails 3 associations error的重新发布。但它是我无法理解的东西。但是好的......继续这个交易......我在这里问了一个与表模式有关的问题。帖子为what is bad in this table schema structure,查询为:

`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 < ActiveRecord::Migration
  def self.up
    create_table :pages do |t|
      t.string :title, :unique => 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 < ActiveRecord::Migration
  def change
    create_table :authors do |t|
      t.string :author, :unique => true, :null => false, :limit => 50
      t.timestamps
    end
  end
end

2 个答案:

答案 0 :(得分:1)

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

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类进行身份验证和帐户维护),您仍然可以将用户称为类的作者

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

可以让你保持好的作者语义,使它们与你的用户类相对应。

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

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

答案 1 :(得分:1)

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

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

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