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模型中设置关联提供了一个很好的答案。 当然,您还需要迁移数据库。 这是做什么的:
- 制作一个名为“作者”的表格。 除了主键“id”之外,它还应该有一个名为“name”的字段,以及“email”。 您可以将同一作者在逻辑上始终相同的任何其他字段从“pages”移动到“authors”。
- 将整数字段“author_id”添加到“pages”。
- 运行“页面”中的现有条目。 对于每个页面,检查作者是否已经在“作者”中。 如果没有,请将作者添加到“authors”,并填写“names”,“email”以及“authors”中的其他字段。 设置“author_id”以引用authors表中的正确ID。
- 删除“作者”,“电子邮件”以及“页面”中其他移动的字段。