私は既存のRails 3.2アプリケーションを4.0にアップグレードしようとしています。私はレンガの壁にぶつかった。Rails 4 .order()がJOINSで字幕に変換される
私は3つのモデル、クライアント、サイト、および連絡先を持っています。サイトはクライアントに属する物理的な場所であり、クライアントは多数のサイトを持つことができます。連絡先は、1つ以上のサイトに所属する人物です。したがって、クライアントはサイトを通じて多くの連絡先を持つことができます。
クライアント:
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
問題はそのI uのです
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
問題があります:SE Client.find(1).contacts
は、私がActiveRecord::StatementInvalid
例外を取得私はORDER BY ... `contacts`.`name` ASC
から来ている見当がつかない。 Contactsテーブルには名前の列はありませんが、Railsはそれを使って並べ替えようとしていますが、どこから来ているのか、どうやって削除するのか分かりません。 ORDER BY `contacts`.`lastname` ASC
は簡単です。それはクライアントモデルから来ます。
これらの関係は3.2で完全に機能しましたが、4.0でこの例外がスローされます。
UPDATE: 余分なORDER BY ... `contacts`.`name` ASC
は、クライアントモデルの最初のhas_many
から来ていることが指摘されています。しかし、その意図は、連絡先ではなくサイトを並べ替えることでした。私はそれを.order('sites.name' => :asc)
に変更しようとしましたが、SQLはsites.sites.name
という名前の列が存在しないとSQLが文句を言いました。したがって、:through =>
をhas_many
と使用すると、order句がマングルされるように見えます。
.order()
を削除し、サイトモデルでdefault_scope -> { order(:name => :asc) }
を使用しましたが、最初に報告されたのとまったく同じエラーが発生しました。あなたの二行目(Client
モデル)で右が、疲れている必要があり
OPではありませんが、順序は名前列(姓の列ではありません)を持つサイトテーブルを参照していると仮定しました。 –
聖なる牛、そうです。私はその '.order()'を取り出して、クエリが機能しました。しかし、Ericが正確に評価したように、連絡先ではなくサイトを並べ替えることを意図していました。テストとして、私は 'に変更しました。order( 'sites.name' =>:asc) '新しい例外がスローされ、 'sites.sites.name'が存在しないと不平を言った。だからどちらの方法でも '.order()'がここで壊れています。 –
奇妙なことに、あなたは正しい@EricPalaceです。私は、それが「クライアント」を指していたと思っています。前回私が同様のリストを注文しなければならなかったのは、 ':conditions => [" joined_table.some_column ... ' –