0

我有三个相关的模型:

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 属性(特别是价格)。我的想法是拥有这三个类并将 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 回答