首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby包含作用域

Ruby包含作用域
EN

Stack Overflow用户
提问于 2020-08-14 21:32:21
回答 4查看 186关注 0票数 2

在我的Rails 6应用程序中,我得到了带有定义的active作用域的模型旅程:

代码语言:javascript
复制
class Journey < ApplicationRecord
  has_many :users, through: :journey_progresses
  has_many :journey_progresses, dependent: :destroy

  scope :active, -> { where(is_deleted: false) }
end

在我的端点中,我希望显示用户journey_progress和序列化程序旅程本身。为此,我使用了下面的查询,它工作得很好

代码语言:javascript
复制
      def query
        current_user.journey_progresses.includes(:journey)
      end

如何修改上述查询以仅显示活动行程?我试着只添加像current_user.journey_progresses.includes(:journey).where(is_deleted: false)一样的地方,但我得到了一个错误:

代码语言:javascript
复制
Caused by PG::UndefinedColumn: ERROR:  column journey_progresses.is_deleted does not exist

根据this answer的说法,我尝试了current_user.journey_progresses.includes(:journey).where(journey: {is_deleted: false} ),但我得到了另一个错误:

代码语言:javascript
复制
Caused by PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "journey"

对于这种操作,正确的语法是什么?

EN

回答 4

Stack Overflow用户

发布于 2020-08-14 21:46:50

您在这里滥用了includesincludes仅用于优化,以减少对数据库的查询数量。

由于您希望根据journey中的值过滤行,因此需要连接它:

代码语言:javascript
复制
current_user.journey_progresses.joins(:journey)

作为对这类问题的一般建议,我建议查看Rails日志,看看最后生成了什么SQL。处理多个has_manyscopeinclude等很快就会变得令人困惑。

更新

实际上,您可以像这样将joinsincludes结合起来:

代码语言:javascript
复制
Foo.includes(:bars).where('bars.name = ?', 'example').references(:bars)

请参阅https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-includes

票数 2
EN

Stack Overflow用户

发布于 2020-08-14 21:47:52

你能试试下面的方法吗?

代码语言:javascript
复制
current_user
  .journey_progresses.
  .joins(:journey)
  .where("journeys.is_deleted = ?", false)
票数 2
EN

Stack Overflow用户

发布于 2020-08-14 22:03:09

代码语言:javascript
复制
current_user.journey_progresses.includes(:journey).where(journey: {is_deleted: false} )

上面的语法可以从Rails 5中获得。

您可以尝试以下可能的方法,

  1. 添加自定义关联

JourneyProgress模型

代码语言:javascript
复制
class JourneyProgress < ApplicationRecord
    belongs_to :active_journey, -> { where(is_deleted: false) }, class_name: 'Journey'
end

并且在查询时包括该关联。

代码语言:javascript
复制
    current_user.journey_progresses.includes(:active_journey)

  1. 添加默认作用域-但从该model(https://apidock.com/rails/ActiveRecord/Base/default_scope/class)

进行查询时将始终应用此作用域

default_scope -> { where(is_deleted: false) }

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63413788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档