[英]How do I create a Rails 3 model backed by a database table without having its attributes dynamically generated by ActiveRecord?
[英]How do I create or update a model based on one of its attributes? (Rails 5)
我正在使用Rails 5和PostGres 9.5。 我有一個具有以下領域的模型……
title | character varying |
我想根據其標題在db / seeds文件中創建或更新模型,這是唯一的約束。 所以我嘗試了
scenario = Scenario.find_or_initialize_by_title(s.title)
scenario.update_attributes(Hash[*@record.attributes.except('created_at','updated_at','id').map { |a| [a.first, nil] }.flatten])
但我收到以下錯誤。 創建或更新模型並排除列出的屬性的正確方法是什么?
localhost:sims nataliab$ rake db:seed
rake aborted!
NoMethodError: undefined method `find_or_initialize_by_title' for #<Class:0x007fb22d28f820>
Did you mean? find_or_initialize_by
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activerecord-5.0.0.1/lib/active_record/dynamic_matchers.rb:21:in `method_missing'
/Users/nataliab/Documents/workspace/sims/db/seed/scenarios.rb:165:in `block in <top (required)>'
/Users/nataliab/Documents/workspace/sims/db/seed/scenarios.rb:164:in `each'
/Users/nataliab/Documents/workspace/sims/db/seed/scenarios.rb:164:in `<top (required)>'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `block in require'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require'
/Users/nataliab/Documents/workspace/sims/db/seeds.rb:10:in `<top (required)>'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `block in load'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/railties-5.0.0.1/lib/rails/engine.rb:549:in `load_seed'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activerecord-5.0.0.1/lib/active_record/tasks/database_tasks.rb:268:in `load_seed'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/activerecord-5.0.0.1/lib/active_record/railties/databases.rake:196:in `block (2 levels) in <top (required)>'
/Users/nataliab/.rvm/gems/ruby-2.3.0/gems/rake-11.3.0/exe/rake:27:in `<top (required)>'
/Users/nataliab/.rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `eval'
/Users/nataliab/.rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)
錯誤消息為您提供了線索:
NoMethodError: undefined method `find_or_initialize_by_title' for #<Class:0x007fb22d28f820>
Did you mean? find_or_initialize_by
現在,動態方法名稱並非真正經過“ Rails批准”,您應該使用find_or_initialize_by
。 在這種情況下,您將使用:
Scenario.find_or_initialize_by(title: s.title)
這是此方法的api文檔的鏈接: http : //apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_initialize_by
試試Scenario.find_or_initialize_by(title: s.title)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.