【问题标题】:Adding to seeds.rb of an existing project, Validation errors and undefined methods添加到现有项目的seeds.rb、验证错误和未定义的方法
【发布时间】:2014-08-02 02:13:35
【问题描述】:

我的任务是向现有 Rails 项目添加种子。我得到了一个包含 12 个调查名称的列表,我应该创建它们,存储它们的 id(在调查列表中的位置)和名称值,然后遍历它们并为每个添加一个占位符survey_question。如果我要创建一个新的迁移,我知道该怎么做,将survey_question 重新定义为survey 的一个属性,但是我应该使用现有的结构,其中survey 和survey_question 是不同的类。我碰壁了。

我的想法是将所有调查名称放在一个数组中,以便在为数据库播种时自动排序:

surveys = [
  "SurveyA",
  "SurveyB",
  "SurveyC",
  "SurveyD",
  "SurveyE",
  "SurveyF",
  "SurveyG",
  "SurveyH",
  "SurveyI",
  "SurveyJ",
  "SurveyK",
  "SurveyL"
]

然后编写一个 each 循环来实例化 Survey 类并将给定的名称存储为数据库条目的 name 属性。在同一个循环中,我将survey_question 定义为占位符问题(你们中的一些人可能认识),并尝试将其附加到使用

surveys.each do |survey|
  survey_question = SurveyQuestion.create(body: "What is the average flight speed velocity of an unladen swallow?")
  Survey.create(name: survey) << survey_question
end

太好了,我写了一个循环。我需要验证它是否符合我的要求。所以我去重新播种数据库并运行 rake db:seed。但是,当我这样做时,我从项目附带的种子.rb 文件中的一行中得到一个验证错误。见这里:

rake aborted!
undefined method `<<' for #<Survey:0x007fb01fe1a3d0>
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activemodel-4.0.3/lib/active_model/attribute_methods.rb:439:in `method_missing'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.3/lib/active_record/attribute_methods.rb:155:in `method_missing'
/Users/bwstud/Box Sync/Work/Codefellows/erp/db/seeds.rb:95:in `block in <top (required)>'
/Users/bwstud/Box Sync/Work/Codefellows/erp/db/seeds.rb:93:in `each'
/Users/bwstud/Box Sync/Work/Codefellows/erp/db/seeds.rb:93:in `<top (required)>'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.3/lib/active_support/dependencies.rb:223:in `load'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.3/lib/active_support/dependencies.rb:223:in `block in load'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.3/lib/active_support/dependencies.rb:214:in `load_dependency'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.3/lib/active_support/dependencies.rb:223:in `load'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/railties-4.0.3/lib/rails/engine.rb:540:in `load_seed'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.3/lib/active_record/tasks/database_tasks.rb:154:in `load_seed'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.3/lib/active_record/railties/databases.rake:181:in `block (2 levels) in <top (required)>'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.3/lib/active_record/railties/databases.rake:140:in `block (2 levels) in <top (required)>'
Tasks: TOP => db:setup => db:seed

这是种子中的违规行 (25):

  #create seed region
  usa = Region.create!(name: "USA")

所以我想,也许出于某种奇怪的原因,这是在创建数据库时编写的并且不能被覆盖,所以如果我清除数据库并重新开始,它将填充而不会抱怨。我跑了 rake db:reset。错误的。在这一点上,我意识到我在上面编写每个循环的方式存在错误。错误消息告诉我

rake aborted!
undefined method `<<' for #<Survey:0x007fb01fe1a3d0>
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activemodel-4.0.3/lib/active_model/attribute_methods.rb:439:in `method_missing'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.3/lib/active_record/attribute_methods.rb:155:in `method_missing'
/Users/bwstud/Box Sync/Work/Codefellows/erp/db/seeds.rb:95:in `block in <top (required)>'
/Users/bwstud/Box Sync/Work/Codefellows/erp/db/seeds.rb:93:in `each'
/Users/bwstud/Box Sync/Work/Codefellows/erp/db/seeds.rb:93:in `<top (required)>'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.3/lib/active_support/dependencies.rb:223:in `load'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.3/lib/active_support/dependencies.rb:223:in `block in load'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.3/lib/active_support/dependencies.rb:214:in `load_dependency'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.3/lib/active_support/dependencies.rb:223:in `load'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/railties-4.0.3/lib/rails/engine.rb:540:in `load_seed'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.3/lib/active_record/tasks/database_tasks.rb:154:in `load_seed'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.3/lib/active_record/railties/databases.rake:181:in `block (2 levels) in <top (required)>'
/Users/bwstud/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.3/lib/active_record/railties/databases.rake:140:in `block (2 levels) in <top (required)>'
Tasks: TOP => db:setup => db:seed

作为数据的最后一点,我检查了数据库中的实际内容,只是想看看那里有什么。这是SELECT * FROM "regions";的结果:

erp_development=# SELECT * FROM "regions"
erp_development-# ;
 id | name |         created_at         |         updated_at         | default_email_sig 
----+------+----------------------------+----------------------------+-------------------
  1 | USA  | 2014-08-01 17:13:06.733146 | 2014-08-01 17:13:06.733146 | 
(1 row)

所以现在我很好并且卡住了。我一直在尽可能多地学习,但我对 Ruby 和 Ruby on Rails 的理解充其量只是入门级的。如果 Stack-land 的任何人可以帮助我了解这一点,我将永远欠你的债。

谢谢, 布赖恩

【问题讨论】:

    标签: ruby-on-rails ruby postgresql


    【解决方案1】:

    http://apidock.com/rails/ActiveRecord/Base/create/class

    survey = Survey.create(name: survey)
    survey.survey_questions << question
    

    上面的代码应该可以工作了!

    【讨论】:

    • 这太棒了,谢谢,但我仍在与区域种子的验证错误作斗争。使用您的代码,当我重置数据库时,我不再看到未定义的方法错误,但我仍然没有填充调查表。还有什么我可以告诉或告诉你的吗?谢谢!
    • 你可以试试 Region.find_or_create_by_name(name: "USA")!这将确保仅当数据库中不存在该记录时才创建该记录,因此验证不会失败!
    【解决方案2】:

    &lt;&lt; 方法只是修改了survey.survey_questions 的返回值,并没有修改对象本身。您应该使用=+= 等修改方法。无论如何,我认为这是一种更清洁的方法:

    surveys.map do |survey|
      Survey.create! do |s|
        s.name = survey
        s.survey_questions.build(body: "What is the average flight speed velocity of an unladen swallow?")
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多