红宝石上轨道协会新手

红宝石上轨道协会新手

问题描述:

这可能被认为是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 
+0

你试过看导游吗? http://guides.rubyonrails.org/association_basics.html – MrDanA 2012-02-12 15:17:59

+0

@MrDanA是的,我看着它。但问题是我有一个与模型相关的窗体..当我从页表中分离作者表时,我得到了一些错误,但我仍然无法纠正。我真的无法通过你寄给我的链接想到一个想法。 – Maverick 2012-02-12 15:24:58

+0

你得到什么类型的错误?你发布的问题只是“协会应该如何工作”,而不是“我的表单中出现错误”(这是一个不同的问题)。 – 2012-02-12 15:27:09

如果我们认为这通过在逻辑上,作者可能有许多页面和页面都属于作者。如果是这种情况,我们可以通过铁轨关系来表达这一点。

class Author < ActiveRecord::Base 
    has_many :pages 

class Page < ActiveRecord::Base 
    belongs_to :author 

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

my_page.author.email 
my_page.author.name 

(假设你的Author类具有这样的属性)

注意,你不一定非得有一个Author类,如果你的用户是你的作者。如果每一个作者是用户(您使用您的用户类认证和账户维护),你仍然可以参考用户为一类

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

,它可以让你保持好的笔者语义通过做的作者他们对你的用户类。

最后一点,如果你想,当你删除一个作家对象自动删除与作者相关的任何页面,您可以添加依赖Author类

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

感谢解释队友。我编辑了我的问题,并将我的迁移分类代码。那里需要改变什么? – Maverick 2012-02-12 15:35:23

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

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

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

alex ..不知道如何执行你提到的第三步? – Maverick 2012-02-12 17:18:07

+1

@mad_programmer,如果您在数据库中没有任何有价值的数据,则可以跳过B并擦除数据库并重新开始。如果您确实有宝贵的数据,您只需要让“作者”表中的所有作者,并将每个页面的“author_id”指向“作者”表中的正确记录。如果您在编写该迁移时需要帮助,请发表其他评论。 – 2012-02-12 18:30:40

+0

我现在没有任何表格。是的,我需要更多的帮助,我正在使用部分窗体来显示'@ page'模型元素。我应该粘贴form.html.erb吗?我只想知道应该如何使用该表单中的作者表元素并获取保存的数据 – Maverick 2012-02-12 18:41:23