2011-03-20 109 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