0

我正在研究Rails 5项目,并且有一个称为Upvote的模型,它是多态的,属于事件或建议。我试图专门抓取属于一个类别或另一个类别的upvotes以及创建事件/建议的人的用户标识,但由于多态性而挣扎。几年前有a similar post,但是当我尝试实施这项技术时,它并没有奏效。具体来说,我将此代码添加到我的给予好评型号:使用包含嵌套多态关联

belongs_to :suggestion, -> { where(upvotes: {idea_type: 'Suggestion'}) }, foreign_key: "idea_id" 

但是当我尝试像

Upvote.includes(:suggestion).last 

在控制台中我得到这个错误:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "upvotes" 
LINE 1: SELECT "suggestions".* FROM "suggestions" WHERE "upvotes"."i... 

任何人都可以请帮助?谢谢:)

回答

1

在Rails5,belongs_to在默认情况下... 因此,一个required: true条款,它总是会检查,如果计数器部分存在......并没有has_many :upvote关系上Suggestion ...

要不需要柜台部分,你可以选择optional: true添加到您的belongs_to条款

belongs_to :suggestion, -> { where(upvotes: {idea_type: 'Suggestion'}) }, foreign_key: "idea_id", optional: true 

OBS1

我刚刚因为这个问题而在Rails上启动了一个Pull请求,在this discussion上,我们发现实际上如果你不希望belongs_to默认为required: true,那么你可以配置这个行为来设置config:

Rails.application.config.active_record.belongs_to_required_by_default = false 

上Rails5的全新安装设置为true,但没有为应用程序设置那里迁移到Rails5

+0

感谢 - 是确定添加的多态模块本身上的has_many?这不是我的错误,我不认为,除非这条线必须在建议上,而不是建议has_many中包含的Upvotable模块:upvotes,as :: idea,dependent :: destroy' – flaurida

+0

只有当您将其范围对于'idea_type =='Suggestion'',但你仍然需要belongs_to作用域...或者upvote会在尝试保存类型为Event的事件时引发错误 – cefigueiredo