【问题标题】:ruby on rails associations newbieruby on rails 协会新手
【发布时间】:2012-02-12 23:34:18
【问题描述】:

这可能被视为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 关联。

edit-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

【问题讨论】:

  • @MrDanA 是的,我看过了。但问题是我有一个与模型关联的表单。当我将作者表与页面表分开时,我遇到了一些错误,但我仍然无法纠正。你发给我的链接我真的想不通。
  • 您遇到什么类型的错误?您发布的问题只是“关联应该如何工作”,而不是“我的表单出现错误”(这是一个不同的问题)。
  • @mad_programmer,您没有像我在回答中指出的那样将“author_id”添加到“pages”中。
  • @AlexD 好的,我会添加它。

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


【解决方案1】:

如果我们从逻辑上考虑这一点,一个作者可能有很多页面,并且页面属于一个作者。如果是这样的话,我们可以通过 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 类。如果每个作者都是用户(并且您使用用户类进行身份验证和帐户维护),您仍然可以将用户称为类的作者

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

它可以让您通过针对您的 User 类来保持良好的作者语义。

最后说明,如果你想在删除作者对象时自动删除与作者关联的任何页面,可以添加对Author类的依赖

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

【讨论】:

  • 感谢朋友的解释。我已经编辑了我的问题并放置了我的迁移分类代码。那里需要改变什么?
【解决方案2】:

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

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

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

【讨论】:

  • alex.. 不确定如何执行您提到的第三步?
  • @mad_programmer,如果您在 DB 中还没有任何有价值的数据,您可以跳过 B 并擦除 DB 并重新开始。如果确实有有价值的数据,只需要获取“authors”表中的所有作者,并使每个页面的“author_id”指向“authors”表中的正确记录即可。如果您在编写迁移时需要帮助,请发表另一条评论。
  • 我现在两个表中都没有任何内容。是的,我需要更多关于我用来显示@page 模型元素的部分形式的帮助。我要粘贴 form.html.erb 吗?我只想知道我应该如何在该表单中使用作者表元素并保存数据
  • @mad_programmer,你为什么不发布一个新的后续问题,并在此处添加后续问题的链接。
  • 这是我发布的问题。 stackoverflow.com/questions/9251624/…
猜你喜欢
  • 2015-04-03
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 2016-06-11
相关资源
最近更新 更多