【问题标题】:Creating an auto-updating list in Rails在 Rails 中创建自动更新列表
【发布时间】:2013-08-12 20:42:25
【问题描述】:

我有三个相关模型:

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

【问题讨论】:

  • 为什么 ShoppingListItem 有价格属性?它不应该简单地引用其关联的 InventoryItem 的价格属性吗?
  • 另外,如果 ShoppingListItem 没有自己的任何属性,那么是的,可以完全取消该模型。您将寻找has_and_belongs_to_many 关系。这仍然需要一个连接表,但它的条目由 ActiveRecord 自动为您管理——您可以执行shopping_list.inventory_items = InventoryItem.where(...) 之类的操作,它会正常工作(通常)。
  • 我的问题可能措辞不当,但这是我的目标。它们将具有相同的属性,因此我确实喜欢此时摆脱额外模型的想法。所以 InventoryItem 模型应该包含:has_and_belongs_to_many :shopping_lists是吗?
  • 参与过一个用户购买代金券的项目,您可能希望 ShoppingListItem 有自己的价格的一个原因是在将商品添加到购物车的确切时间维护价格历史记录,而不是新的价格。但是您似乎在说您确实希望更新价格,所以我同意@Grantovich 的观点,即您应该取消 ShoppingListItem 连接模型。
  • 有趣的点卡洛斯,谢谢。为此,我可能不需要任何价格历史记录,但可以为未来的项目考虑(:

标签: ruby-on-rails database activerecord associations


【解决方案1】:

要重做我的 cmets 作为真正的答案,是的,在这种情况下可以放弃 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 选项指定表名。

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 2017-03-09
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多