0

次のテーブルがあるとしましょう。

      product              transaction
------------------     ------------------
| id |   name    |     | id |  product  |            
------------------     ------------------
| 1  | Product A |     | 1  |     2     |
| 2  | Product B |     | 2  |     3     |
| 3  | Product C |     | 3  |     2     |
------------------     ------------------

ここで、テーブルのリストを作成しtransactionたいが、製品IDの代わりに製品名を表示したいとします。

生のSQLでは、次のようにします。

SELECT product.name FROM transaction, product WHERE transaction.product = product.id

RailsのActiveRecordQueryInterfaceを使用してこれがどのように行われるかを理解するのに苦労しています。これは、Railsの専門家にとっては些細なことだと思います。

4

2 に答える 2

2

あなたがそれを「レールの方法」で解決したいなら:

productまず、トランザクションの列をに変更します。product_idテーブル名は複数形にする必要があります。そうしないと、たとえばset_table_name 'transaction'モデルに追加する必要があります。変更しないと、多くのRailsの先物を見逃してしまいます。

これらのモデルを追加/変更します。

class Product < ActiveRecord::Base
  has_many :transactions
end

class Transaction < ActiveRecord::Base
  belongs_to :product
end

列名「product」を引き続き使用する場合は、次のように変更する必要がありますbelongs_to

  belongs_to :product, :foreign_key => 'product'

でもそれはちょっと醜いです

最後に、これを使用します。

Transaction.includes(:product)

または、製品を持っている人だけが欲しい場合

Transaction.joins(:product)

注:正確には覚えていませんが、一部のアプリケーションでテーブル名として「トランザクション」を使用する際に問題が発生したと思います。他の誰かがおそらくそれについて知っています。

于 2012-11-22T01:08:03.763 に答える
1
transaction.joins('LEFT OUTER JOIN product ON transaction.id = product.id')
于 2012-11-22T00:17:26.103 に答える