0

我有一个模型,它有大约 50 列测量数据,每列都有不同的测量单位(即克、盎司等)。将计量单位与数据库中的列相关联的好方法是什么?其主要用途只是用于显示目的。(Ruby on Rails)

编辑:澄清一下,我的模型是一个对象,属性是该对象的不同测量值。所以,一个例子是,如果我有模型Car和属性列,,,,:power:torque。我想返回和返回:weight,等等。这样,我就可以做这样的事情::wheelbasecar.power.unithpcar.weight.unitlbs.

<%= car.power + car.power.unit %>

它会返回

400hp
4

2 回答 2

1

更新的答案

由于您要存储许多数据列,但每一列只有一种类型,并且您的关注点是严格的表现形式,所以我只会使用装饰器来完成您所需要的。有关使用Draper执行此操作的好方法的示例,请参阅此railscast

基本上,装饰器使用特定于演示的方法包装您的模型,因此而不是:

#CarsController.rb
def show
  @car = Car.find(params[:id])
end

你会用

#CarsController.rb
def show
  @car = CarDecorator.find(params[:id])
end

你会像这样定义一个装饰器:

class CarDecorator < ApplicationDecorator
  decorates :car

  def horsepower
    model.power.to_s + "hp" #call to_s just in case
  end

end

那么在你看来,任何时候你打电话@car.horsepower都会得到123hp而不是123. 通过这种方式,您可以构建一个很长的可重复使用的表示方法列表。您可以使用继承在对象之间共享方法,也可以允许调用来自原始模型的方法。请参阅 railscast 和文档等。您可以使用 Draper,或者如果您不想使用库,也可以滚动自己的演示者类。


上一个答案(删节):

我可以看到两种不错的简单方法:

units1)只需为您的数据模型添加一个文本列。IE:获得“400hp”使用[data.value,data.units].join

2)您可以通过拥有一个Units模型来获得更丰富的关联,也许在ActiveEnum 之类的帮助下。

于 2012-04-16T16:52:38.350 回答
1

您可以添加具有for属性的单元模型,将属性保存在要应用该单元的消息中。例子:

def Unit < ActiveRecord::Base
  scope :for, lambda{|messurement| find_by_for( messurement.to_s ) }
end

这使您可以使用以下内容:

<%= @car.torque + Unit.for(:torque).symbol %>

我不知道这是否有这么大的优势,但它是解决您问题的一种方法......

于 2012-04-16T16:54:25.373 回答