gpt4 book ai didi

ruby-on-rails - Rails 4 .order() 被 JOINS 破坏

转载 作者:行者123 更新时间:2023-12-03 16:10:43 24 4
gpt4 key购买 nike

我正在将现有的 Rails 3.2 应用程序升级到 4.0。不过,我碰到了一堵砖墙。

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

客户:

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异常(exception):

Mysql2::Error: Unknown column 'contacts.name' in 'order clause': SELECT contacts.* FROM contacts INNER JOIN contacts_sites ON contacts.id = contacts_sites.contact_id INNER JOIN sites ON contacts_sites.site_id = sites.id WHERE sites.client_id = 5 AND sites.deleted = 0 ORDER BY contacts.lastname ASC, contacts.name ASC



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

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

更新:
有人指出,额外的 ORDER BY ... `contacts`.`name` ASC来自第一个 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 破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17370432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com