У меня проблема с отношением has_many, когда я получаю случайное исключение из ActiveRecord:
product = Product.create!(valid_attributes)
product.prices
# throws:
NoMethodError:
undefined method `scan' for nil:NilClass
Похоже, это связано с "inverse_of", но я, по-видимому, сделал то, чего ActiveRecord не ожидал, но не мог быть обеспокоен, чтобы получить хорошую ошибку. Лучше всего предположить, что это как-то связано с моим столбцом с именем «столбец» (хотя его нет в черном списке AFAIK). Я использую PostgreSQL. РЕДАКТИРОВАТЬ: попытался переименовать столбец в «column_name» и «parent_column», но это не помогло. Попробую еще кое-что.
Вот соответствующий код модели и схема:
class Price < ApplicationRecord
belongs_to :parent, polymorphic: true
end
class Product < ApplicationRecord
has_many :prices, as: :parent, inverse_of: :parent
end
class CreatePrices < ActiveRecord::Migration[5.2]
def change
create_table :prices do |t|
t.string :parent_type, null: false
t.bigint :parent_id, null: false
t.string :column, null: false
t.decimal :price, null: false, precision: 15, scale: 2
t.timestamp :effective_date, null: false
end
add_index :prices, [:parent_type, :parent_id, :column]
end
end
И полная трассировка стека:
NoMethodError:
undefined method `scan' for nil:NilClass
# /Users/william/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/inheritance.rb:185:in `compute_type'
# /Users/william/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/reflection.rb:422:in `compute_class'
# /Users/william/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/reflection.rb:379:in `klass'
# /Users/william/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/reflection.rb:234:in `inverse_of'
# /Users/william/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/reflection.rb:239:in `check_validity_of_inverse!'
# /Users/william/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/reflection.rb:474:in `check_validity!'
# /Users/william/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/associations/association.rb:26:in `initialize'
# /Users/william/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/associations.rb:237:in `new'
# /Users/william/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/associations.rb:237:in `association'
# /Users/william/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/associations/builder/association.rb:108:in `prices'