【问题标题】:Rails ActiveRecord ORDER BY not respected in nested includesRails ActiveRecord ORDER BY 在嵌套包含中不受尊重
【发布时间】:2016-02-15 14:18:56
【问题描述】:

我遇到了一个奇怪的问题。我试图用谷歌搜索,但我可能没有使用正确的措辞(我是 RoR 的新手)。

我正在通过我的一个模型的范围使用一些嵌套的急切加载。所以我有这样的事情:

scope :includes_all, lambda {includes(
  :buggy_relation,
  :another_relation,
  an_attribute: [:first_attribute, :second_attribute])}

其中 :buggy_relation 在同一模型中被声明为类似这样的内容:

has_many :buggy_relation, -> {order(:order_index)}, class_name: 'SomeClass'

所以,关键是,只要我的includes() 语句中没有an_attribute,SQL 请求看起来是正确的,并且我可以在 SomeClass.order_index 上看到 ORDER BY 语句。但是,一旦我用an_attribute: [:first_attribute, :second_attribute] 添加嵌套加载,:buggy_relation 的顺序就不再考虑在内。错误的关系显然已加载,但没有说明相应的 ORDER BY 导致订单不被尊重。

不当行为的一个例子是使用 cmets 发表博客文章:

#EXPECTED
post -> comment 1
     -> comment 2
     -> comment 3

#OBTAINED
post -> comment 2
     -> comment 3
     -> comment 1

如果您对此有任何提示...

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord


    【解决方案1】:

    因此,您可以通过 cmets 在任何地方执行以下操作

    post.comments.order(:order_index).each do |comments|
    

    【讨论】:

    • 是的,但这里的想法是使用急切加载。因此包括在内。事实上,急切加载有效,只有当我添加这个嵌套加载时,它才不再有效。订单本身运作良好
    • 是的,但是当您在视图中订购时,它已经加载,您可以订购它
    • 我明白你的意思,你是对的。重点是,我主要不是在寻找解决方法,我想了解我做错了什么,因为到目前为止我能够阅读的内容以及我对这种关系所做的一些实验,它 应该工作。另外,我会有点难过急切地加载应该排序的关系(并且没有嵌套属性)并且必须在之后重新排序它,这没有多大意义。但是,如果我的用例不存在并且我做的完全错误,那么我肯定会实施您的建议。
    猜你喜欢
    • 2020-06-30
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多