在我的Rails 6应用程序中,我得到了带有定义的active作用域的模型旅程:
class Journey < ApplicationRecord
has_many :users, through: :journey_progresses
has_many :journey_progresses, dependent: :destroy
scope :active, -> { where(is_deleted: false) }
end在我的端点中,我希望显示用户journey_progress和序列化程序旅程本身。为此,我使用了下面的查询,它工作得很好
def query
current_user.journey_progresses.includes(:journey)
end如何修改上述查询以仅显示活动行程?我试着只添加像current_user.journey_progresses.includes(:journey).where(is_deleted: false)一样的地方,但我得到了一个错误:
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} ),但我得到了另一个错误:
Caused by PG::UndefinedTable: ERROR: missing FROM-clause entry for table "journey"对于这种操作,正确的语法是什么?
发布于 2020-08-14 21:46:50
您在这里滥用了includes。includes仅用于优化,以减少对数据库的查询数量。
由于您希望根据journey中的值过滤行,因此需要连接它:
current_user.journey_progresses.joins(:journey)作为对这类问题的一般建议,我建议查看Rails日志,看看最后生成了什么SQL。处理多个has_many、scope、include等很快就会变得令人困惑。
更新
实际上,您可以像这样将joins与includes结合起来:
Foo.includes(:bars).where('bars.name = ?', 'example').references(:bars)请参阅https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-includes
发布于 2020-08-14 21:47:52
你能试试下面的方法吗?
current_user
.journey_progresses.
.joins(:journey)
.where("journeys.is_deleted = ?", false)发布于 2020-08-14 22:03:09
current_user.journey_progresses.includes(:journey).where(journey: {is_deleted: false} )上面的语法可以从Rails 5中获得。
您可以尝试以下可能的方法,
在JourneyProgress模型中
class JourneyProgress < ApplicationRecord
belongs_to :active_journey, -> { where(is_deleted: false) }, class_name: 'Journey'
end并且在查询时包括该关联。
current_user.journey_progresses.includes(:active_journey)进行查询时将始终应用此作用域
default_scope -> { where(is_deleted: false) }
https://stackoverflow.com/questions/63413788
复制相似问题