红宝石上轨道协会新手
这可能被认为是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
如果我们认为这通过在逻辑上,作者可能有许多页面和页面都属于作者。如果是这种情况,我们可以通过铁轨关系来表达这一点。
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
感谢解释队友。我编辑了我的问题,并将我的迁移分类代码。那里需要改变什么? – Maverick 2012-02-12 15:35:23
创建一个单独的表的作者可能是一个好主意(尽管如果这已经适合你,并且你没有任何性能问题,你可以保持原样)。
@Marc Talbot已经给出了一个很好的答案,关于如何在你的Rails模型中设置关联。当然,你也需要迁移你的数据库。这是做什么:
- 做一个名为“作者”的表。除了主键“id”之外,它还应该有一个名为“name”的字段以及“email”。您可以移动任何其他字段,这些字段在逻辑上对于同一作者而言从“页面”到“作者”始终是相同的。
- 将一个整数字段“author_id”添加到“pages”中。
- 运行“页面”中的现有条目。对于每个页面,检查作者是否已经在“作者”中。如果没有,请将作者添加到“作者”,并在“作者”中填写“姓名”,“电子邮件”和其他字段。将“author_id”设置为从authors表中引用正确的ID。
- 删除“作者”,“电子邮件”和其他从“页面”移动的字段。
alex ..不知道如何执行你提到的第三步? – Maverick 2012-02-12 17:18:07
@mad_programmer,如果您在数据库中没有任何有价值的数据,则可以跳过B并擦除数据库并重新开始。如果您确实有宝贵的数据,您只需要让“作者”表中的所有作者,并将每个页面的“author_id”指向“作者”表中的正确记录。如果您在编写该迁移时需要帮助,请发表其他评论。 – 2012-02-12 18:30:40
我现在没有任何表格。是的,我需要更多的帮助,我正在使用部分窗体来显示'@ page'模型元素。我应该粘贴form.html.erb吗?我只想知道应该如何使用该表单中的作者表元素并获取保存的数据 – Maverick 2012-02-12 18:41:23
你试过看导游吗? http://guides.rubyonrails.org/association_basics.html – MrDanA 2012-02-12 15:17:59
@MrDanA是的,我看着它。但问题是我有一个与模型相关的窗体..当我从页表中分离作者表时,我得到了一些错误,但我仍然无法纠正。我真的无法通过你寄给我的链接想到一个想法。 – Maverick 2012-02-12 15:24:58
你得到什么类型的错误?你发布的问题只是“协会应该如何工作”,而不是“我的表单中出现错误”(这是一个不同的问题)。 – 2012-02-12 15:27:09