0

つまり、注文、アイテム、ユーザーの3つのモデルがあります。

User
has_many :items

Order
has_many :items

Item
belongs_to :user
belongs_to :order

私の問題は次のとおりです。UserモデルとOrderモデルも関連付けたい(関連付けがあるように:Order:belongs_to:user、User has_many:orders)。Orderモデルに:user_idを含む新しい列を作成したいと思います。しかし、アイテムにはすでにユーザーとの関連付けがあるため、これは正しくありませんか?データベースにuser_idフィールドを追加しなくても、必要なものを取得できる、ファンシーな関係はありますか?

私は技術的に言うことができます:

User 
has_many :orders, :through => :items

Order
has_many :users, :through => :items

しかし、これは私にとってハックのように感じます。ユーザーを注文に関連付けるには、order.users.firstと言う必要があります(注文にはhas_many:itemsがありますが、すべてのアイテムには1人のユーザーしかいません)

また、アイテムが作成され、注文に関連付けられていない期間があるため、アイテムとユーザーの関連付けを削除することはできません。

4

1 に答える 1

1

両方の種類の関連付けを維持すると、長期的には問題が発生します。今すぐ正しく設定し、rakeタスクを使用して古いデータを新しいスキーマに適合させる方がよいと思います。

User -> Order -> Itemしたがって、前進するように設定してから、データベースを更新するためのrakeタスクを作成します。

  1. item.order == nil#レガシーレコードであるすべてのアイテムの場合
  2. 新しい注文を作成する
  3. 新しいorder.user_idをitem.user_idに設定し、保存します
  4. item.order_idを新しいorder.idに設定し、保存します
  5. すすぎ、繰り返します

これでスキーマが正しく設定され、すべてのレガシーデータが新しい形式に移行されました。そして何よりも、レガシー形式に準拠しようとすることに固執することはありません。

擬似コードで申し訳ありませんが、今日は病気です。:)

于 2013-03-21T13:33:44.887 に答える