0

関連するモデルが 3 つあります。

class InventoryItem < ActiveRecord::Base
    belongs_to  :item, :foreign_key => :item_id
    belongs_to  :vendor
    has_many    :shopping_list_items

class ShoppingList < ActiveRecord::Base
    has_many    :shopping_list_items
    belongs_to  :user
end

class ShoppingListItem < ActiveRecord::Base
  belongs_to    :shopping_list
  belongs_to    :inventory_item
end

私がやろうとしているのは、InventoryItem テーブル (価格) でそれぞれの属性が変更されたときに ShoppingListItem 属性 (具体的には価格) を自動更新するサイドバー ショッピング リストを作成することです。私の考えでは、これら 3 つのクラスを用意して、ShoppingListItems を InventoryItems に直接マップすることでしたが、それをどのように進めるかはわかりません。または、ShoppingListItem クラスを完全に廃止して、ShoppingList をユーザーが指定した InventoryItems のコレクションにすることはできますか? どんな入力でも大歓迎です。前もって感謝します!

4

1 に答える 1

1

本当の答えとして私のコメントをやり直すには、はい、ShoppingListItemこの場合、そのモデル自体にデータを添付する必要がない限り、モデルを放棄することができます(たとえば、アイテムがリストに追加された時間) . has_and_belongs_to_many次のように関連付けを使用してモデルをリンクできます。

class InventoryItem < ActiveRecord::Base
    belongs_to :item
    belongs_to :vendor
    has_and_belongs_to_many :shopping_lists
end

class ShoppingList < ActiveRecord::Base
    belongs_to :user
    has_and_belongs_to_many :inventory_items
end

これにより、在庫品目の配列を買い物リストの属性に割り当てることができinventory_items、Rails は必要な結合レコードを自動的に作成または削除します。詳細については、Rails ガイドを参照してください。スキーマには引き続き結合テーブルが必要であることに注意してください。モデルが関連付けられていないだけです。あなたの場合、移行は次のようになります。

create_table :inventory_items_shopping_lists, id: false do |t|
  t.references :inventory_item
  t.references :shopping_list
end

add_index :inventory_items_shopping_lists, :inventory_item_id
add_index :inventory_items_shopping_lists, :shopping_list_id
add_index :inventory_items_shopping_lists, [:inventory_item_id, :shopping_list_id], unique: true

Rails がテーブルを自動検出するためには、その名前は両方のモデルの複数形をアルファベット順に組み合わせたものでなければならないことに注意してください。join_tableそれ以外の場合は、関連付けを定義するときにオプションを使用してテーブル名を指定する必要があります。

于 2013-08-13T01:12:23.510 に答える