Ruby on Rails 3:将额外数据与模型相关联

时间:2011-03-20 18:17:21

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

几乎是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距离我已经习惯了一步之遥。

2 个答案:

答案 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]访问它,这将适用于

页面中出现的任何数据库查询