Ruby   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ruby-on-rails – Rails 4 .order()被JOINS破坏了大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在努力将现有的Rails 3.2应用程序升级到4.0.不过,我遇到了一堵砖墙.

我有三个模型,Client,Site和Contact.站点是属于客户端的物理位置,客户端可以有许多站点.联系人是属于一个或多个站点的人员.因此,客户可以通过站点拥有多个联系人.

客户:

class Client < ActiveRecord::Base

  has_many :sites,-> { where(:sites => {:deleted => falsE}).order(:name => :asC) },:dependent => :destroy
  has_many :contacts,-> { order(:lastname => :asC) },:through => :sites

end

站点:

class Site < ActiveRecord::Base

  belongs_to :client
  has_and_belongs_to_many :contacts

end

联系方式:

class Contact < ActiveRecord::Base

  has_and_belongs_to_many :sites

end

问题是,当我使用Client.find(1).contacts时,我得到一个ActiveRecord :: StatemenTinvalid异常:

有问题:我不知道ORDER BY …`contacts` .name` ASC来自哪里. Contacts表没有名称列,但Rails正在尝试使用它进行排序,我不知道它来自何处或如何删除它. ORDER BY`contact` .lastname`ASC很简单;它来自客户端模型.

这些关系在3.2中完美运行,但现在在4.0中抛出此异常.

更新:
有人指出额外的ORDER BY …`contacts` .name` ASC来自Clients模型中的第一个has_many.但是,目的是对网站进行排序,而不是联系人.我尝试将其更改为.order(‘sites.name’=>:asC),并且SQL抱怨没有名为sites.sites.name的列.因此,似乎在使用时:through =>使用has_many,order子句被破坏了.

我尝试删除.order()并使用default_scope – >站点模型中的{order(:name =>:asC)},但得到的错误与最初报告的完全相同.

解决方法

解决方案很简单.我没有使用.order(:column_name =>:asC),而是将其更改为.order(‘column_name ASC’),错误消失了,产生了预期的结果.我最初拥有后者,但是实现了前者作为我的Rails 3的一部分 – > 4升级,并在RailsCasts和其他文档中看到了这样的约定.

当我使用.joins()和按联接表列排序时,这也是必要的,正如我后来发现的那样.这是有道理的,因为关联也使用连接.

大佬总结

以上是大佬教程为你收集整理的ruby-on-rails – Rails 4 .order()被JOINS破坏了全部内容,希望文章能够帮你解决ruby-on-rails – Rails 4 .order()被JOINS破坏了所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。