2012-04-16 24 views
0

我有一個有大約50列測量數據的模型,每個模型都有不同的度量單位(即克,盎司等)。將度量單位與數據庫中的列相關聯的好方法是什麼?這主要用於顯示目的。 (Ruby on Rails)Rails - 將測量單位與我的數據庫列相關聯的好方法?

編輯:澄清,我的模型是一個對象,屬性是該對象的不同測量。因此,一個例子是,如果我有模型Car和屬性列:power:torque:weight:wheelbase,等我想car.power.unit回到hpcar.weight.unit返回lbs.,等等。這樣,我就可以做是這樣的:

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

,它會返回

400hp 
+0

做你的列以不同的單位結束?也就是說,你有時有動力,有時有瓦特,或每列總是一個單位類型? – Andrew 2012-04-16 19:52:39

+0

@Andrew - 目前,只需要一種單位類型。這可能會在未來的迭代中實現,但爲了這個問題的目的,不需要進行任何轉換。 – Nick 2012-04-16 19:57:10

+0

你不能添加一個單位的表格,並添加像「torque_unit」的列到messurements-table,在那裏你保存單位的id?這可以很容易地處理同一屬性的不同單位。在單元模型中,您可以使用所有單元間轉換方法,如果您需要這些... – klump 2012-04-16 21:03:51

回答

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或者您可以推出自己的演示者課程。


前面的答案(摘要):

我可以看到兩個漂亮的,簡單的方法來做到這一點:

1)只是爲了units文本列添加到您的數據模型。 IE:獲得「400hp」使用[data.value,data.units].join

2)通過使用Units模型,或許可以從ActiveEnum之類的幫助中獲得更多的關聯。

+0

看起來很有前途 - 我會給它一個鏡頭並確認它是否有效。 – Nick 2012-04-16 21:29:47

1

你可以添加一個單元模型與for屬性,在這裏你保存屬性在messurement,要應用的單位。例如:

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

這允許你這樣的東西:

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

我不知道這是不是這麼多的優點,但其爲您解決問題的方式......

+0

請參閱我對主要問題的新編輯 - 我有一個模型,其中包含許多屬性測量列。 – Nick 2012-04-16 19:48:37

相關問題