我有三个模型,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异常:
MysqL2::Error: Unknown column ‘contacts.name’ in ‘order clause’: SELECT
contacts
.* FROMcontacts
INNER JOINcontacts_sites
ONcontacts
.id
=contacts_sites
.contact_id
INNER JOINsites
ONcontacts_sites
.site_id
=sites
.id
WHEREsites
.client_id
= 5 ANDsites
.deleted
= 0 ORDER BYcontacts
.lastname
ASC,contacts
.name
ASC
有问题:我不知道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)},但得到的错误与最初报告的完全相同.