几乎是Ruby / Rails的初学者。
我有一个包含多个部分的视频:
@video = Video.find(params[:id])
@sections=@video.sections;
我想将颜色属性与每个部分相关联,但颜色是在控制器中计算的,而不是存储在数据库中。
到目前为止,我一直在我的控制器中创建一个@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模型,使其具有'color'属性,以便我可以通过@sections[i].colour
我尝试将它放在models / sectiondata.rb中:
class SectionData
extend Section
attr_accessor :colour
end
但是当我尝试在我的控制器中执行SectionData.new
时,我收到错误消息,说它无法找到该类。我也不知道如何让原始@section
成为新的SectionData类的一部分。
解决此问题的最佳方法是什么?关于我的编码风格的任何提示也将受到赞赏,Ruby距离我已经习惯了一步之遥。
答案 0 :(得分:1)
我认为在这种情况下实现hashes更好,而不是让两个数组相互对应。 例如,
result_hash = {sports_section => 'blue'}
答案 1 :(得分: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])
@sections=@video.sections
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
然后,给定一个名为“section”的Section对象,您可以使用@sectionDatas[section]
访问它,这将适用于