2011-03-20 108 views
0

幾乎是Ruby/Rails的初學者。Ruby on Rails 3:將額外的數據與模型關聯

我有很多第一個視頻:

@video = Video.find(params[:id]) 
@[email protected]; 

我想每部分顏色屬性相關聯,但顏色是由控制器來計算,而不是存儲在數據庫中。

到目前爲止,我已經簡單地創建在我的控制器一@colours陣列,其中指數匹配了與部分

hues = [41, 6, 189, 117, 279] 
saturation = 100; 
brightness = 45; 

@colours = []; 
@sections.each { @colours.push Color::HSL.new(hues[j%hues.length], saturation, brightness) } 

使@sections[i]對應@colours[i]的索引。

這工作正常,但似乎不是最好的辦法。我想延長我的第模型,使其具有「顏色」屬性,這樣我就可以做@sections[i].colour

我試圖把這個模型中/ sectiondata.rb訪問:

class SectionData 
    extend Section 
    attr_accessor :colour 
end 

但當我在我的控制器中嘗試執行SectionData.new時,我收到一個錯誤,說它找不到該類。我也不知道如何讓原來的@section成爲新的SectionData類的一部分。

解決此問題的最佳方法是什麼?我的編碼風格的任何提示也將被讚賞,紅寶石是從我習慣了一大步。

回答

0

首先,我試圖把它們作爲attr_accessors在Section模型,不這樣做。錯誤的編碼器!如果ActiveRecord再次爲該頁面加載查詢數據庫,即使查詢被緩存,它們也不會顯示。如果您需要ActiveRecord的方法,您可以加載ActiveModel使用

相反,我創建了屬性訪問器類:

sectiondata.rb:

class SectionData 
    attr_accessor :left, :width, :timeOffset, :colour, :borderColour 
end 

然後你就可以使用他們的工作將Section對象映射到SectionData的對象:

xxx_controller.rb

@video = Video.find(params[:id]) 
@[email protected] 

require 'sectiondata.rb' 
@sectionDatas=Hash.new 

@sections.each do |i| 
    sd=SectionData.new 

    # set whatever attributes here, e.g. 
    sd.left= total/multiplier 

    @sectionDatas[i]=sd 
end 

然後,給所謂的「部分」一節的對象,你可以使用@sectionDatas[section]訪問它,這將對於發生在

1

我認爲在這種情況下實現hashes是一個比較好的主意,而不是讓兩個數組相互對應。 例如,

result_hash = {sports_section => 'blue'} 
+0

我的頁面,對一些數據(有一個任何數據庫查詢工作不僅僅是顏色),但我很好奇現在如何用類來做到這一點。 – bcoughlan 2011-03-20 19:55:30

+0

如果您需要「顏色」屬性,爲什麼不爲您的Section模型添加數據庫列?我沒有看到需要擴展您的Section模型並定義自定義屬性。 – Shreyas 2011-03-21 10:07:30