在Rails中创建自动更新列表

时间:2013-08-12 20:42:25

标签: ruby-on-rails database activerecord associations

我有三个相关的模型:

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的集合?任何输入都非常感谢。提前谢谢!

1 个答案:

答案 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选项指定表名。