我有三个相关的模型:
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属性(特别是价格)。我的想法是拥有这三个类并将ShoppingListItem直接映射到InventoryItems,但我不确定如何继续进行。或者,是否可以完全取消ShoppingListItem类,并使ShoppingList成为用户指定的InventoryItems的集合?任何输入都非常感谢。提前谢谢!
答案 0 :(得分: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将自动创建或删除必要的连接记录。 More information from the Rails guides.请注意,您的架构中仍然需要一个连接表 - 只是没有与之关联的模型。在您的情况下,迁移可能如下所示:
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
选项指定表名。