使用包含嵌套多态关联

时间:2017-02-27 17:24:45

标签: ruby-on-rails postgresql polymorphism rails-activerecord

我正在开发一个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...

有人可以帮忙吗?谢谢:))

1 个答案:

答案 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的应用程序设置