Поиск соответствующих атрибутов в модели - PullRequest
1 голос
/ 01 августа 2011

У меня есть модель с 30 атрибутами. но эти атрибуты могут быть сгруппированы в 2 группы.

Например, у меня есть:

string:title
string:text
...

и

string:title_old
string:text_old
...

Я хочу иметь возможность: при одновременной проверке атрибута title проверить атрибут title_old. Могу ли я выполнить это с помощью цикла, если я сделаю массив из 15 первых строк, или я должен написать жестко закодированные операторы

Конечная цель:

        [
          {
             :name => :title,
             :y => 1 (constant),
             :color=> red, (if title_old == "something" color = red else color = green)
          },
          {
             :name=> :text,
             :y => 1 (constant)
             :color => red (if text_old == "something" color = red else color = green)
          },
          .... (all other 13 attributes)
       ]

Ответы [ 4 ]

1 голос
/ 01 августа 2011

Очень простой пример:

class MyModel
  def identify_color
    if send("#{name}_old".to_sym) == "something"
      'red'
    else
      'green'
    end
  end
end

MyModel.all.collect do |instance|
  attrs = instance.attributes
  attrs.merge!('color' => identify_color)
  attrs
end

Добавьте спасения по своему усмотрению, но это можно сделать разными способами.

1 голос
/ 01 августа 2011

ваша модель:

class MyModel < AR::Base
  def attributize
    attrs = self.attributes.except(:created_at, :updated_at).reject{ |attr, val| attr =~ /.*_old/ && !val }
    attrs.inject([]) do |arr, (attr, val)|
      arr << { :name => attr, :y => 1, :color => (self.send("#{attr}_old") == "something" ? "red" : "green") }
    end
  end
end

использование:

my_object = MyModel.last
my_object.attributize
0 голосов
/ 02 августа 2011

используйте state_machine, таким образом, ваша логика будет в одном месте с ясным dsl.https://github.com/pluginaweek/state_machine

0 голосов
/ 01 августа 2011

Попробуйте это:

[
 :title,
 ..,
 ..
 :description
].map do |attr|
  {
    :name => attr,
    :y => 1 (constant),
    :color=> (read_attribute("#{attr}_old") == "something") ? "red" : "green"
  }  
end

PS: присвоение имени атрибуту text - плохая идея.

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