首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails将word或枚举数组映射为整数或浮点数。

Rails将word或枚举数组映射为整数或浮点数。
EN

Stack Overflow用户
提问于 2022-09-07 02:21:11
回答 2查看 119关注 0票数 0

我不知道这个问题被称为什么,但是否可以通过以下方式在模型中列出一个列表:

array of word

代码语言:javascript
复制
equipment %w[foo bar kimi etc...]
equipcost %i[10 35 85 etc...] 

enum

代码语言:javascript
复制
enum equipment: { foo: 10,
                  bar: 35,
                 kimi: 83,
                 etc...
               }

然后在数组中保存多个数组,即

代码语言:javascript
复制
 t.string "equipment_list", default: [], array: true

{ equipment_list => ["foo", "bar"] } or { equipment_list => [10, 35] }

然后,当通过@object.equipment_list调用对象时,它引用array of wordsenum

所以在视图中,我说的是<%= @object.equipment_list %>,并显示foo和bar。或者,如果我在模型中,我可以使用一个方法来添加值以获得总成本:

代码语言:javascript
复制
def cost
   e = self.equipment_list
   e.value
   e.inject(:+)
end

有没有一种红宝石或铁轨的方法来做到这一点?array of words方法似乎是错误的,而emun方法只适用于一个值。

我找到了this,但就像他们说的那样,它是一个指数,而不是一个实际值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-07 09:49:54

将数据硬编码到您的应用程序中并不是一个好主意,除非您希望在每次buisness逻辑要求进行微不足道的更改时更改代码,或者您喜欢在凌晨3点被召集。使用数组/JSON/HSTORE/Seiized垃圾桶列实际上也不是一种好方法:

无数据normalization

  • Bad类型支持(无十进制类型)

  • 无Assocations

  • Violates第一范式(1NF)

相反,可以创建一个连接表,在该表中可以存储存储和设备之间的关系以及描述两个buisness实体之间关系的任何其他数据:

代码语言:javascript
复制
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逻辑,您将不得不考虑诸如如何处理数量之类的问题。如果您想得到设备成本的总和,那么简单的实现是:

代码语言:javascript
复制
# 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)
票数 1
EN

Stack Overflow用户

发布于 2022-09-07 02:38:35

序列化为数组的列很少是一个好方法。

您需要的是一个equipments表,其中包含namecost列。

这个表与另一个模型相关联,仅举个例子,我将称之为Store

代码语言:javascript
复制
# 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
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73629425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档