【发布时间】:2015-01-28 21:23:52
【问题描述】:
我很难通过委托方法对查询进行排序。我的任务是帮助将一个相当大的 Rails 3 应用程序升级到 Rails 4。我在索引操作中遇到了这个查询。 我知道这些对象的命名是可怕和混乱的。
# measurements_controller.rb
def index
@measurements = Measurement.includes(:identifier).order(:name)
end
在 Rails 4 中,我收到此错误:
ERROR: column info_items.name does not exist LINE 1: ...D (info_item_identifiers.name LIKE '%') ORDER BY "info_item...
于是我看了一下模型,发现:
# measurement.rb
class Measurement < InfoItem
...
end
# info_item.rb
belongs_to :identifier, class_name: 'InfoItemIdentifier'
delegate :name, :name=, to: :identifier
# info_item_identifier.rb
# This object has a name column in the database
如果我在终端中并且我有一个Measurement 的实例,我可以轻松地调用.name 方法并且效果很好。但是当涉及到.order(:name) 时,由于该列不存在,这不起作用。
我找到了一种解决方案,但它似乎违背了委托方法的目的。在控制器中,我可以将其更改为:
@measurements = Measurement.includes(:identifier).order('info_item_identifiers.name')
由于我知道InfoItem 将name 方法委托给InfoItemIdentifiers,我认为我的控制器不需要知道它被委托给了哪里。
有没有办法保留现有代码并仍然通过委托方法排序?
【问题讨论】:
-
是否将包含更改为 eager_load 帮助(或添加 .references(:identifier) )
-
好提示,我确实阅读了 Rails 4 和
.references。唉,我尝试了你的两个建议都没有运气。明天早上我回到工作岗位时,我会尝试任何其他建议。谢谢!
标签: ruby-on-rails ruby ruby-on-rails-4 delegates rails-activerecord