【问题标题】:Rails: Best practice for handling development dataRails:处理开发数据的最佳实践
【发布时间】:2011-10-14 17:12:11
【问题描述】:

我有以下场景:

我正在开始开发一个长期项目(大约 6 个月),我需要一些关于数据库的信息来测试我的功能。问题是现在,我没有表格来插入这些信息(我将来会)但我需要在数据库上加载信息,处理这个的最好方法是什么?特别考虑到应用完成后,我将不再需要这个过程。

例如,假设我有需要分类的任务。我已经开始处理这些任务,但我需要在我的数据库中加载一些类别。

我正在使用 Rails 3.1 顺便说一句。

提前致谢!

编辑

关于种子:有人告诉我,如果您的数据可能略有不同,则种子不是最佳选择,因为您必须删除所有信息并重新插入。说..我想更改或添加类别,然后我必须编辑种子.rb 文件,进行修改,然后删除并重新加载所有数据....,还有其他方法吗?或者种子是解决这个问题的最好方法?

【问题讨论】:

  • 当然 :) 看看种子的作用,你会发现你可以在 ruby​​ 文件中创建任何有效的创建,然后运行然后文件本身,例如new_categories.rb。你也可以做一个 rake 任务来做到这一点。
  • 我只会将种子用于必须在应用程序中才能在生产中工作的数据。您最好使用fixture 来获取开发/测试数据:guides.rubyonrails.org/testing.html#the-low-down-on-fixtures

标签: ruby-on-rails-3 coding-style standards


【解决方案1】:

听起来您可能会在添加、更改或删除与其他数据混合的过程中添加、更改或删除数据。所以种子.rb 出来了。您需要使用的是迁移。通过这种方式,您可以通过顺序过程搜索和识别要更改的数据,而迁移正是为此而设计的。否则,我认为您最好的选择是通过 rails 控制台手动更改数据。

编辑:一个很好的例子如下。

您正在使用 Capistrano 来处理您的部署。您想在系统中添加一个新类别玩具。在迁移文件中,您可以在迁移函数中添加Category.create(:name => "Toys") 或类似的东西(我忘记了他们现在在Rails 3.1 中如何称呼它,但我知道只有一个方法),在本地运行rake db:migrate,测试您的更改,提交它们,然后在可接受的情况下使用 cap:deploy 部署它,这将对您的生产数据库运行新的迁移,插入新类别,并使其可用于已部署的应用程序。

除了那个例子,它真的取决于你的工作流程。如果您认为通过迁移添加新数据不会影响您的应用程序,那就去做吧。我会说 DHH (David Heinemeier Hansson) 不喜欢它,因为他严格使用它来随着时间的推移改变数据库的结构。如果你不知道 DHH 是 Rails 的创造者。

编辑 2: 我刚刚想到的一个想法,如果您对迁移不满意,它可以让您跳过使用迁移的概念。您可以 100% 依赖您的 db/seeds.rb 文件。当您想到“seeds.rb”时,您会想到创建信息,但不一定非要如此。与其盲目地创建数据,不如检查相关数据是否已经存在,如果存在则修改并保存,如果不存在则创建一个简单明了的新记录。

db/seeds.rb

toys = Category.find_by_name("Toys")
if toys then
  toys.name = "More Toys"
  toys.save
else
  Category.create(:name => "More Toys")
end

运行rake db:seeds,该代码将运行。每次更改数据时,您只需要一致地更新 seed.rb 文件,以便 1) 它正在搜索正确的数据值,并且 2) 它正在更新正确的属性。

最终,没有正确或错误的方法可以做到这一点,只要适合您和您的工作流程即可。

【讨论】:

  • 嗯,有趣.. 我认为迁移是为了管理数据库的结构,而不是它的内容。你能提供一个例子或链接吗?
  • 我曾经在 RailsCasts 的一集中看过它,但我记不起是哪一集了。 Ryan Bates 所做的一切对我来说都像是纯金。我看看能不能找到。
  • 我已经更新了我的答案,为您提供了一个示例和另一个利用seeds.rb 的替代方案。
  • 我看到你接受了这个作为你的答案,谢谢!你最终选择了哪条路线?
  • 是的,这表明您花时间并尽职尽责地解释您的想法。我还没有采取任何路线,但我想我会使用你的种子示例,为种子.rb 文件提供一些逻辑,以便决定何时更新、何时插入以及何时删除......再次感谢!
【解决方案2】:

加载开发数据的地方是db/seeds.rb。由于您可以在那里编写任意 Ruby 代码,因此您甚至可以从外部文件加载您的开发数据。

【讨论】:

    【解决方案3】:

    有一个名为 db/seeds.rb 的文件

    您可以使用它来实例化记录

    user1=User.create(:email=>"user@test.com", 
      :first_name=>"user", 
      :last_name=>"name", 
      :bio=>"User bio...", 
      :website=>"http://www.website.com", 
      :occupation=>"WebDeveloper",
      :password=>"changeme", 
      :password_confirmation=>"changeme", 
      :avatar => File.open(File.join(Rails.root, '/app/assets/images/profiles/image.png'))
      )
    user2=User.create(:email=>"user2@test.com", 
      :first_name=>"user2", 
      :last_name=>"name2", 
      :bio=>"User2 bio...", 
      :website=>"http://www.website.com", 
      :occupation=>"WebDeveloper",
      :password=>"changeme", 
      :password_confirmation=>"changeme", 
      :avatar => File.open(File.join(Rails.root, '/app/assets/images/profiles/image.png'))
      )
    

    只需从命令行运行rake db:seed 即可将其放入数据库

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      相关资源
      最近更新 更多