1

私は次の設定をしています。モデル Client はモデル Contacts のサブクラスです。STI テーブルは連絡先です。

次に、テストコードで呼び出し時にエラーが発生します

it "should have the right clients in the right order" do
  @producer.clients.should == [a_client, b_client]
end

ORDER BY 句で、存在しないクライアント テーブルを誤ってアドレス指定する SQL ステートメントを使用します。

1) Producer clients associations should have the right clients in the right order
     Failure/Error: @producer.clients.should == [a_client, b_client]
     ActiveRecord::StatementInvalid:
       PGError: ERROR:  missing FROM-clause entry for table "clients"
       LINE 1: ...lient') AND "contacts"."producer_id" = 6 ORDER BY clients.na...
                                                                    ^
       : SELECT "contacts".* FROM "contacts"  WHERE "contacts"."type" IN ('Client') AND "contacts"."producer_id" = 6 ORDER BY clients.name DESC

私は SQL の専門家ではありませんが、クライアント テーブルがアドレス指定されている場合、またはテーブルが実際の連絡先によってアドレス指定されている場合は、何らかのエイリアスを設定する必要があります。

降順は、Client の default_scope 順から来ています。

class Client < Contact
  ...    
  default_scope order: 'clients.name DESC'
end

これは Rails 3.2.11 および Postgres 9.1、pg gem 0.12.2 にあります。

4

1 に答える 1

1

自分で見つけました:

デフォルトのスコープは、contacts.name を参照する必要があります。これは、そのままデータベースに転送される SQL ステートメントの一部と思われるためです。

于 2013-03-12T16:43:00.747 に答える