0

モデルに適切な ActiveRecord の関連付けが何であるかを把握しようとしています。非常に必要最小限の e コマース サイトを作成したいと考えています。製品をアップグレードおよび修理するためのシステムを持ちたいので、ユーザーの注文履歴にアクセスできることが重要です。

私の現在の設定は次のとおりです。

ユーザー

has_many :products, :through => :orders

has_many :orders, :dependent => :destroy

注文

belongs_to :user

has_many :products

製品

belongs_to :orders

私の最初の質問は、これは理にかなっていますか? 製品が多くの異なる注文の一部であることを確認したいので (明らかな理由で)、製品の belongs_to :orders 部分に関心があります。これが間違っている/正しい場合、正しい関係に必要な必要な移行は何ですか?

前もって感謝します。

4

2 に答える 2

6

投稿がかなり古いことは承知していますが、同じ問題に直面していたので、フォロワーのために明確にすることは興味深いかもしれません. @ManojMonga がコメントで述べたように、ここでは関連付けを使用する必要がありますhas_and_belongs_to_many。したがって、モデルは次のようになります:
User

has_many :orders, :dependent => :destroy
has_many :products, through: :orders

注文

belongs_to :user
has_and_belongs_to_many :products

製品

has_and_belongs_to_many :orders

次に、Active Record Association Rails Guideで説明されているように、注文と製品の外部キーを保持する結合テーブルを作成する必要があります。移行は次のようになります。

class OrdersProducts < ActiveRecord::Migration
  def change
    create_table :orders_products, id: false do |t|
      t.belongs_to  :order, index: true
      t.belongs_to  :product, index: true
      t.timestamps
    end
  end
end

次に、移行を実行した後、has_and_belongs_to_many メソッドを使用できるようになります。has_an_belongs_to_many アソシエーションで結合テーブルを作成するとき、Active Record はアルファベット順に連結された 2 つのテーブル名から名前が付けられたテーブルを探すことに注意してください。それ以外の名前を付けたい場合は、次のようにモデルで指定する必要があります

has_and_belongs_to_many :products, :join_table => "new_tables_name"

製品

has_and_belongs_to_many :orders, :join_table => "new_tables_name"

最後にthe has_many :products, through: :orders、ユーザーのモデルでは必須ではありません。ユーザーを介して製品にアクセスできるようにするだけです。以上です、何かの参考になれば幸いです。ちなみにRails4.1を使っています。

于 2015-08-24T14:40:37.937 に答える
1

製品has_one :order。これにより、のようなものを使用できるようになりますが@product.order、実際には、製品データベーステーブルに注文用の外部キーは作成されません。

于 2013-02-10T23:53:41.980 に答える