我不知道这个问题被称为什么,但是否可以通过以下方式在模型中列出一个列表:
array of word
equipment %w[foo bar kimi etc...]
equipcost %i[10 35 85 etc...] 或enum
enum equipment: { foo: 10,
bar: 35,
kimi: 83,
etc...
}然后在数组中保存多个数组,即
t.string "equipment_list", default: [], array: true
{ equipment_list => ["foo", "bar"] } or { equipment_list => [10, 35] }然后,当通过@object.equipment_list调用对象时,它引用array of words或enum。
所以在视图中,我说的是<%= @object.equipment_list %>,并显示foo和bar。或者,如果我在模型中,我可以使用一个方法来添加值以获得总成本:
def cost
e = self.equipment_list
e.value
e.inject(:+)
end有没有一种红宝石或铁轨的方法来做到这一点?array of words方法似乎是错误的,而emun方法只适用于一个值。
我找到了this,但就像他们说的那样,它是一个指数,而不是一个实际值。
发布于 2022-09-07 09:49:54
将数据硬编码到您的应用程序中并不是一个好主意,除非您希望在每次buisness逻辑要求进行微不足道的更改时更改代码,或者您喜欢在凌晨3点被召集。使用数组/JSON/HSTORE/Seiized垃圾桶列实际上也不是一种好方法:
无数据normalization
相反,可以创建一个连接表,在该表中可以存储存储和设备之间的关系以及描述两个buisness实体之间关系的任何其他数据:
class Equipment < ApplicationRecord
has_many :store_equipments
has_many :stores, through: :store_equipments
end
class Store
has_many :store_equipments
has_many :equipments, through: :store_equipments
end
# rails g model store_equipment store:belongs_to equipment:belongs_to cost:decimal
class StoreEquipment < ApplicationRecord
belongs_to :store
belongs_to :equipment
end根据它加入的两件事命名表/模型只是一个非常懒惰的惯例--如果可能的话,可以使用一个更合适的名称,以符合该事物实际表示的正确性逻辑。
这里的具体实现将取决于您的buisness逻辑,您将不得不考虑诸如如何处理数量之类的问题。如果您想得到设备成本的总和,那么简单的实现是:
# for a single record
store = Store.find(1)
equipment_cost = @store.store_equipments.sum(:cost)
# fetch it for a group of records in a single query
stores = Store.left_joins(:store_equipments)
.select(
Store.arel_table[Arel.star],
StoreEquipment.arel_table[:cost].sum.as('equipment_cost')
)
.group(:id)发布于 2022-09-07 02:38:35
序列化为数组的列很少是一个好方法。
您需要的是一个equipments表,其中包含name和cost列。
这个表与另一个模型相关联,仅举个例子,我将称之为Store:
# equipments.rb
class Equipment < ApplicationRecord
has_and_belongs_to_many :stores
end
# stores.rb
class Store < ApplicationRecord
has_and_belongs_to_many :equipments
def equipment_cost
equipments.pluck(:cost).sum
end
endhttps://stackoverflow.com/questions/73629425
复制相似问题