Ruby on Rails 3: связывание дополнительных данных с моделью - PullRequest
0 голосов
/ 20 марта 2011

Практически новичок в 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 ]

1 голос
/ 20 марта 2011

Я думаю, что в этой ситуации лучше реализовать хешей вместо двух соответствующих друг другу массивов. Например,

result_hash = {sports_section => 'blue'}
0 голосов
/ 22 марта 2011

Сначала я попытался поместить их как 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], и это будет работать для любых запросов к базе данных, которые происходят на странице

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...