0

я столкнулся с нечетной ошибкой при попытке сделать обновление партии:Is: apps/'apps' зарезервированы в Rails v4?

rake db:caching:stats:calculate 
rake aborted! 
NoMethodError: undefined method `each' for 2548:Fixnum 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/associations/collection_association.rb:365:in `replace' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/associations/collection_association.rb:47:in `writer' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/associations/builder/association.rb:123:in `apps=' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/attribute_assignment.rb:54:in `public_send' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/attribute_assignment.rb:54:in `_assign_attribute' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/attribute_assignment.rb:41:in `block in assign_attributes' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/attribute_assignment.rb:35:in `each' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/attribute_assignment.rb:35:in `assign_attributes' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/persistence.rb:251:in `block in update' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/transactions.rb:351:in `block in with_transaction_returning_status' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `block in transaction' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract/transaction.rb:184:in `within_new_transaction' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/transactions.rb:220:in `transaction' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/transactions.rb:348:in `with_transaction_returning_status' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/persistence.rb:250:in `update' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/relation.rb:369:in `update' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/relation.rb:366:in `block in update' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/relation.rb:366:in `map' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/relation.rb:366:in `with_index' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/relation.rb:366:in `update' 
/usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/querying.rb:8:in `update' 
/home/ubuntu/workspace/pf_middleware/lib/tasks/caching/calculate_stats.rake:42:in `block (4 levels) in <top (required)>' 
Tasks: TOP => db:caching:stats:calculate 

Я производил довольно большой набор обновлений, поэтому я использовал следующий гарантировать, что я проходил в то, что я ожидал, и произвел ту же ошибку ,

School.update([1,2,3], [{apps: 11111},{apps: 22222},{apps: 33333}]) 
==> NoMethodError: undefined method `each' for 11111:Fixnum 

Я проверил и перепроверял документацию, попробовал «приложения» вместо: приложений. Дважды проверено, что приложения были полем в школе и т. Д., Но не могли понять, почему я продолжал получать эту ошибку.

Я решил попробовать другое поле ... и это сработало!

hash = { 1 => { offers: 123 }, 2 => { offers: 321 } } 
School.update(hash.keys, hash.values) 

Это приводит меня к мысли, что: Приложения/«приложения» что-то особенное, но я не могу найти доказательство. У кого-нибудь есть мысли?

Спасибо!

+0

У вас есть как ассоциация, так и столбец с тем же именем? –

ответ

1

OK, так как у вас есть полностью изменил ваш вопрос, так как мой первый ответ, вот еще один.

Когда вы сделаете это

School.update([1,2,3], [{apps: 11111},{apps: 22222},{apps: 33333}]) 

Это как сказать

School.find(1).update_attributes({apps: 11111}) 
School.find(1).update_attributes({apps: 22222}) 
School.find(1).update_attributes({apps: 33333}) 

И когда вы говорите

School.find(1).update_attributes({apps: 11111}) 

вы фактически говоря

school = School.find(1) 
school.apps = 11111 
school.save 

Если ваш школьный класс не имеет метода экземпляра, называемого «apps =», или он это делает, но этот метод не ожидает целого числа, он будет вызывать исключение (или, в последнем случае, может привести к непредсказуемым результатам) ,

В этом случае, если school has_many :apps, то метод «School # apps =» - это тот, который настроен ассоциацией has_many, и ожидает массив объектов App.

+0

Ваша проблема не в имени столбца/имени класса, это метод «school.apps», добавленный ассоциацией has_many, как я уже сказал. –

0

Это не имеет ничего общего с ": apps". Этот синтаксис не является действительным:

2 => :apps => 321 

Ключевые пары значений можно использовать синтаксис старого стиля, например

{:apps => 123} 

или новый стиль синтаксический сахар:

{apps: 123} 

, но есть только два из них: ключ и значение. Нельзя сказать, что

{2 => :apps => 321} 

Однако, вы можете иметь хэш в качестве ключа, или значение, так что вы можете сказать

{2 => {:apps => 321}} 

или

{{2 => :apps} => 321} 

В вашей дело, похоже, вы хотели сказать

hash = { 1 => { :apps => 123 }, 2 => {:apps => 321 } } 

Я думаю, вы просто пропустили {.

+0

Хорошая уловка, но это все еще не касается исходной ошибки. –

Смежные вопросы