【问题标题】:How to set default data in a table in rails?如何在rails的表中设置默认数据?
【发布时间】:2013-03-29 01:01:17
【问题描述】:

我有一张表,我将在其中存储测量单位和相应的类别。例如,“杯子,体积”和“盎司,质量”。我只关心大约 12 个测量值,我希望它们在数据库中而不需要手动输入,因为无论何时我想部署它或将代码移动到某个地方,我都希望重新创建它。

所以,我认为最好的方法是使用它们创建一个 csv 文件,然后使用 rake db:seed。但是我以前从未这样做过,所以有人可以指导我如何创建这个 csv,以及如何编写 seed.rb 文件来生成它吗?这是正确的做法吗?


解决方案:

#db/seeds.rb
require 'open-uri'

#Supply all the units of measurement to be used
Unit.delete_all
open("db/seeds/measurements.csv") do |measurements|
  measurements.read.each_line do |measurement|
    unit, uof = measurement.chomp.split(",")
    Unit.create!(:name => unit, :unit_of => uof)
  end
end

【问题讨论】:

  • 如果您只有 12 个测量值并且可能不再添加,那么创建一个表并将它们存储在数据库中是否有意义?可能是解决这个问题的其他方法。
  • 你说得对,但我认为如果我只提供 12 个选项会变得一团糟,我也可能想在未来添加一些功能,例如,一旦你选择了一个体积单位所有其他选择都会降低质量,因此您不能混合和匹配体积和质量。这是我将它们存储在那里的主要原因,您会建议另一种方式吗?

标签: ruby-on-rails seed


【解决方案1】:

只需编写用于手动生成它们的代码并将其放入种子.rb 中。您可以在该文件中使用普通的 ruby​​;所以要么写简单的create,要么加载你存储的csv,例如db/seeds/measurements.csv。要获取该文件的路径,请使用Rails.root.join("db/seeds/measurements.csv")

例子:

File.open(Rails.root.join("db/seeds/measurements.csv")) do |f|
  # use f here
end

【讨论】:

  • 所以一旦我有了csv文件,你上面提到的代码只会正确加载文件吗?我将如何用该数据填充数据库?遍历每一个并将它们输入到单位表中?
  • 是的,例如,就像您在控制器中创建任何其他数据集一样。
  • 我无法使用 Rails.root.join 加载文件,我必须使用 open。我使用的代码在上面的问题中。它有效,谢谢:)。但是,我有一个问题,这些单位在另一个表(外键)中被引用,所以如果我确实需要更新这个表,或者如果我像这样再次运行 rake 命令,每个记录的 id更改,因此与另一张表的链接被破坏。你会如何解决这个问题?
  • 您在最初创建数据库后不使用seeds.rb。在这种情况下,我会使用迁移(或另一个 rake 任务)。关于Rails.root:您只能从中获得一条与File.open 一起使用的路径。
  • 谢谢,这很有道理。不过,关于 Rails.root,您能否举一个示例,说明如何在我的解决方案更新中将上述代码与上述代码一起使用,以便我接受您的回答?
【解决方案2】:

db 目录中有一个名为seeds.rb 的文件。

您可以在其中添加默认数据,当您执行rake db:seed 时,该数据将填充到您的数据库中。

这是一个如何添加种子的示例。

product_types = ProductType.create([
                                   {:name => 'clock',:organisation_id => 1}
])

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 2010-11-14
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多