rails使用'参考'在发电机

时间:2014-11-22 12:06:56

标签: ruby-on-rails

在rails中使用模型和迁移生成器时,可以使用'references'关键字,因为它是一种数据类型,表示该字段是另一个模型的外键,即另一个表。
在这个例子中,我使用书表中的作者字段(实际上该字段不是'作者')。

rails g model book title publication_date:date author:references

查看已创建的迁移和模型,我们可以更好地了解rails从命令中猜到的信息(这不是问题的一部分,而是更多的逻辑和现有技术的总结)这个命令):

移植

class CreateBooks < ActiveRecord::Migration
  def change
    create_table :books do |t|
      t.string :title
      t.references :author, index: true
      t.date :publication_date

      t.timestamps
    end
  end
end

这里rails再次使用'references'方法,因为它是一种数据类型,但它实际上意味着我们是'基本'数据结构级别的顶层,实际上是在数据级别引用作者手段,添加'author_id'而不是'author'列。它确实如此(我还检查了schema.rb以确认)。
除此之外,它还提供了一个索引:从表现的角度来看,这是一个很好的做法。

模型

以这种方式调用生成器也会在模型上“做些什么”:

class Book < ActiveRecord::Base
  belongs_to :author
end

即,它添加了'belongs_to:author'。
请注意,您甚至可以使用references子句创建书籍模型和迁移,然后创建作者之前的作者。它强制执行最后的 (如果它完全在这样的事情上)。

问题

我的问题是关于哪些rails没有做,即:作者模型上的has_many子句。
1)因为通常它确实存在之前创建了书模型,所以rails应该很容易将has_many添加到此。是否有任何参数说导轨这样做?
2)因为模型可以引用其他模型,即使它们尚未创建,另一种可能性是在创作者期间声明某种“has_many”参考,是否有可能以某种方式进行?

1 个答案:

答案 0 :(得分:1)

  1. 无法知道放在哪里,您必须指定它。
    这种发电机旨在节省时间,并使这样的东西节省太少或没有。例如,您必须明确指定目标类,以及它是has_one还是has_many。这会减去一些有用的东西,导致非常小的正值甚至负值。

  2. 我认为您的意思是即使在未保存的模型上也可以使用关联。是的,他们是,但他们不太可靠。它非常简单:未保存的对象为每个存储临时对象的关联都有一个集合。保存主对象时,会创建这些集合中的新关联对象(尚未保留)。一个例子:

    a = Author.new(name: "Charles Dickens")
    a.books << Book.new(title: "Oliver Twist")
    a.save
    

    这会将新作者保存到数据库中,并且由于他的id将会被人知道,因此它会创建一个新书author_id。这涉及has_many ... through: ...以及可能的其他情况时有点奇怪,所以请谨慎使用。