我正在开发一个Rails 5项目并且有一个名为Upvote的模型,它是多态的,属于Event或Suggestion。我试图专门抓住属于一个类别或另一个类别的投票以及创建事件/建议的用户ID,但由于多态性而苦苦挣扎。几年前就有a similar post,但是当我尝试实施这项技术时,它并没有起作用。具体来说,我将此代码添加到我的Upvote模型中:
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...
有人可以帮忙吗?谢谢:))
答案 0 :(得分: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上启动了拉取请求,并且在this discussion我们发现实际上如果你不想要belongs_to
required: true
默认情况下,您只需配置设置配置的行为:
Rails.application.config.active_record.belongs_to_required_by_default = false
在新安装的Rails5上设置为true,但是没有为迁移到Rails5的应用程序设置