我正在建立费用跟踪器
class ShoppingList
has_many :items
end
class Item
end
但我不太确定,如何存放这些物品。到目前为止我的想法:
第一
Item.new(name: 'milk', price: 1)
Item.new(name: 'chocolate', price 2)
这很简单,但同样的事情可能最终会有不同的名称。
Item.new(name: 'biscuits', price: 3)
Item.new(name: 'cookies', price: 3)
第二
class Milk < Item; end
class Chocolate < Item; end
Milk.new(price: 1)
这感觉有点复杂,每次购买新东西时都必须添加一个类 - 另一方面,一旦完成 - 我想事情会更容易搜索。
解决这个问题的正确方法是什么?各自的优点/缺点是什么?
答案 0 :(得分:0)
你的第一种方法肯定更有意义。如果你担心他们是名字的别名,你甚至可以包括另一个表
class Item
has_many :alternate_names
end
然后在您必须创建的备用名称表中查找要保存的项目,并将该关系带回项目。所以对于输入名称:&#34;饼干&#34;,价格:3你可以做类似的事情
> alternatesearch = AlternateName.find_by(name: "biscuits")
=> #<AlternateName id: 5, item_id: 2, name: "biscuits">
> Item.find(alternatesearch.item_id)
=> #<Item id:2 name:"cookies" price:"3">
或者如果它是一个新项目,您可以在alternatesearch上使用find或create by,然后在创建它时创建一个新项目。我对你想要购物清单的确切内容感到困惑,或者你是想每次都添加新商品还是重复使用它们而是改变价格。
我认为这比第二种方法更好,因为第二种方法对它可能拥有的项目数量有很大的限制,你基本上会在rb类文件中保存你的数据库信息,这将使它变得非常困难改变。但我想这可能是一个优势,取决于你想拥有多少项目。