Ruby on rails &引用;多态关联不支持计算类。”;尝试保存没有关联的记录时

Ruby on rails &引用;多态关联不支持计算类。”;尝试保存没有关联的记录时,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个名为Bill的ActiveRecord模型,它有一个多态关联:Bill\u元素 has_many :sites, through: :bill_elements, source: :element, source_type: 'Site' has_many :primary_billing_points, through: :bill_elements, source: :element, source_type: 'PrimaryBillingPoint' 我想确保至少选择了一个bi

我有一个名为Bill的ActiveRecord模型,它有一个多态关联:Bill\u元素

has_many :sites, through: :bill_elements, source: :element, source_type: 'Site'
has_many :primary_billing_points, through: :bill_elements, source: :element, source_type: 'PrimaryBillingPoint'
我想确保至少选择了一个bill元素,并因此添加了它

validates :bill_elements, length: { minimum: 1 }
但是,只要用户单击“保存”,我就会得到一个错误:
多态关联不支持计算类。

控制器执行
@bill.update(账单属性)

似乎验证没有运行。我尝试在其中添加一个带有puts语句的自定义验证,如果我更新了任何其他字段,我会看到puts语句,但如果我删除了关联的站点/主要计费点,则不会看到

以下是完整的堆栈跟踪:

ActiveRecord::Reflection::BelongsToReflection#compute_class
activerecord (5.2.1) lib/active_record/reflection.rb, line 420
ActiveRecord::Reflection::BelongsToReflection#klass
activerecord (5.2.1) lib/active_record/reflection.rb, line 379
ActiveRecord::Associations::HasManyThroughAssociation#delete_records
composite_primary_keys (11.0.3) lib/composite_primary_keys/associations/has_many_through_association.rb, line 22
ActiveRecord::Associations::HasManyThroughAssociation#remove_records
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 398
ActiveRecord::Associations::HasManyThroughAssociation#remove_records
activerecord (5.2.1) lib/active_record/associations/has_many_through_association.rb, line 108
block in ActiveRecord::Associations::HasManyThroughAssociation#delete_or_destroy
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 391
block in ActiveRecord::Associations::HasManyThroughAssociation#transaction
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 134
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#transaction
activerecord (5.2.1) lib/active_record/connection_adapters/abstract/database_statements.rb, line 252
Site.transaction
activerecord (5.2.1) lib/active_record/transactions.rb, line 212
ActiveRecord::Associations::HasManyThroughAssociation#transaction
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 133
ActiveRecord::Associations::HasManyThroughAssociation#delete_or_destroy
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 391
ActiveRecord::Associations::HasManyThroughAssociation#delete
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 188
ActiveRecord::Associations::HasManyThroughAssociation#replace_records
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 412
block in ActiveRecord::Associations::HasManyThroughAssociation#replace
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 250
block in ActiveRecord::Associations::HasManyThroughAssociation#transaction
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 134
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#transaction
activerecord (5.2.1) lib/active_record/connection_adapters/abstract/database_statements.rb, line 252
Site.transaction
activerecord (5.2.1) lib/active_record/transactions.rb, line 212
ActiveRecord::Associations::HasManyThroughAssociation#transaction
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 133
ActiveRecord::Associations::HasManyThroughAssociation#replace
activerecord (5.2.1) lib/active_record/associations/collection_association.rb, line 250
ActiveRecord::Associations::HasManyThroughAssociation#ids_writer
composite_primary_keys (11.0.3) lib/composite_primary_keys/associations/collection_association.rb, line 26
Bill#site_ids=
activerecord (5.2.1) lib/active_record/associations/builder/collection_association.rb, line 65
Bill#_assign_attribute
activemodel (5.2.1) lib/active_model/attribute_assignment.rb, line 51
block in Bill#_assign_attributes
activemodel (5.2.1) lib/active_model/attribute_assignment.rb, line 44
Bill#_assign_attributes
activemodel (5.2.1) lib/active_model/attribute_assignment.rb, line 43
Bill#_assign_attributes
activerecord (5.2.1) lib/active_record/attribute_assignment.rb, line 23
Bill#assign_attributes
activemodel (5.2.1) lib/active_model/attribute_assignment.rb, line 35
block in Bill#update
activerecord (5.2.1) lib/active_record/persistence.rb, line 427
block in Bill#with_transaction_returning_status
activerecord (5.2.1) lib/active_record/transactions.rb, line 387
block in ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#transaction
activerecord (5.2.1) lib/active_record/connection_adapters/abstract/database_statements.rb, line 254
block in ActiveRecord::ConnectionAdapters::TransactionManager#within_new_transaction
activerecord (5.2.1) lib/active_record/connection_adapters/abstract/transaction.rb, line 239
ActiveSupport::Concurrency::LoadInterlockAwareMonitor#mon_synchronize
/Users/jeremynagel/.rvm/rubies/ruby-2.3.7/lib/ruby/2.3.0/monitor.rb, line 214
ActiveRecord::ConnectionAdapters::TransactionManager#within_new_transaction
activerecord (5.2.1) lib/active_record/connection_adapters/abstract/transaction.rb, line 236
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#transaction
activerecord (5.2.1) lib/active_record/connection_adapters/abstract/database_statements.rb, line 254
Bill.transaction
activerecord (5.2.1) lib/active_record/transactions.rb, line 212
Bill#with_transaction_returning_status
activerecord (5.2.1) lib/active_record/transactions.rb, line 385
Bill#update
activerecord (5.2.1) lib/active_record/persistence.rb, line 426
block in Admin::BillsController#update
app/controllers/admin/bills_controller.rb, line 84
Admin::BillsController#respond_to
actionpack (5.2.1) lib/action_controller/metal/mime_responds.rb, line 197
Admin::BillsController#update
app/controllers/admin/bills_controller.rb, line 83

我使用的是Rails 5.2。

我认为错误表明不支持这种验证?如果找不到其他解决方案,可以创建自定义验证函数。这里有一个可能有用的方法。@pibano我试过了,但函数似乎没有被调用(请参阅post REPUTS语句中的我的语句)。该错误似乎与验证完全无关。