【问题标题】:Using includes with nested polymorphic association将包含与嵌套多态关联一起使用
【发布时间】:2017-02-27 17:24:45
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    在 Rails5 上,belongs_to 默认有一个required: true 子句... 所以,它总是检查计数器是否存在......并且Suggestion上没有has_many :upvote关系......

    如果不需要计数器部分,您可以将选项 optional: true 添加到您的 belongs_to 子句中

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

    OBS1

    我最近因为这个问题在 Rails 上发起了一个 Pull Request,在 this discussion 上我们发现实际上如果你不希望 belongs_to 默认为 required: true,你可以配置设置配置的行为:

    Rails.application.config.active_record.belongs_to_required_by_default = false
    

    在全新安装 Rails5 时设置为 true,但未为迁移到 Rails5 的应用设置

    【讨论】:

    • 谢谢 - 可以在多态模块本身上添加 has_many 吗?我认为这不是我的错误,除非这条线必须在 Suggestion 上而不是在 Suggestion has_many :upvotes, as: :idea, dependent: :destroy 中包含的 Upvotable 模块上
    • 仅当您将其范围设置为idea_type == 'Suggestion' 但您仍需要将belongs_to 范围...
    猜你喜欢
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多