Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Получить все атрибуты


Автор: rax 19.10.2010, 15:58
Доброго дня

Полазил по документации и гуглу, ничего не нашел
Есть ActiveRecord объект, в котором заполнены некоторые атрибуты, а некоторые не заполнены
Объект записывается в сессию и на следующем шаге сервиса добавляются новые данные, и на последнем шаге делается save
Есть функция update у массивов, вот примерно тоже самое мне нужно сделать для атрибутов ActiveRecord
можно ли?

Спасибо

Автор: shine 19.10.2010, 17:29
Функция update есть у хэшей а не у массивов. Для ActiveRecord update_atributes подойдет?

Автор: rax 19.10.2010, 18:13
Да, у хэшей. 
Насколько я знаю update_atributes будет пытаться занести значения в базу и спотыкнется, потому что в моем случае атрибута id еще нет
Мне же нужно все сделать лишь на уровне параметров класса 

Автор: solenko 19.10.2010, 18:26
Стандартной такой не знаюю, но! Это же ruby )
Код

module ActiveRecord
  class Base
     def write_attributes(attr_hash)
        attr_hash.each { |name, value|
           write_attribute(name, value)
        }
     end
  end
end


obj = MyModel.new
obj.write_attributes(:attr1 => 'val1', :attr2 => 'val2')

Автор: rax 20.10.2010, 09:37
Так оно понятно, что если атрибуты уже есть в хэше, то обновить объект не составит труда.
Вся фигня в том, как атрибуты перегнать в хэш, при условии что количество этих атрибутов нам неизвестно и нет возможности сделать это вручную, как у вас в 13-ой строке

Автор: solenko 20.10.2010, 14:01
Код

<form>
<input type="text" name="object[attr1]" value="val1" />
<input type="text" name="object[attr2]" value="val2" />
</form>


Код

obj = MyModel.new
obj.write_attributes(params[:object])

Автор: source777 20.10.2010, 19:59
Цитата(solenko @  19.10.2010,  18:26 Найти цитируемый пост)
Стандартной такой не знаюю, но! Это же ruby )

Не правильно, это же Rails, надо читать код. Вот, кстати:
Код

      def update_attributes(attributes)
        self.attributes = attributes
        save
      end

Ни на какие мысли не наводит?

Зачем огород городить, когда всё проще некуда "из коробки"

Код

obj = MyModel.new
obj.attributes = {:attr1 => 'val1', :attr2 => 'val2'}
# или
obj.attributes = params[:object]




Цитата(rax @  19.10.2010,  15:58 Найти цитируемый пост)
Есть ActiveRecord объект, в котором заполнены некоторые атрибуты, а некоторые не заполнены
Объект записывается в сессию и на следующем шаге сервиса добавляются новые данные, и на последнем шаге делается save

Зачем так извращаться? В сессию объекты записывать - это вообще ни в какие ворота. Создай сразу объект в БД и заполняй аттрибуты сколько влезет.

Автор: solenko 21.10.2010, 08:45
Цитата(source777 @  20.10.2010,  18:59 Найти цитируемый пост)
Ни на какие мысли не наводит?

Код

obj = MyModel.new
obj.attributes = {:attr1 => 'val1', :attr2 => 'val2'}
# или
obj.attributes = params[:object]

Наводит на мысль, что на втором шаге прийдется делать как минимум
obj.attributes.merge!(params[:object])

Ну и на мою write_attributes, скорее всего прийдется навешивать еще вызов чего-то вроде valid_for_attributes?(*attrs)

Автор: source777 21.10.2010, 18:39
Цитата(solenko @  21.10.2010,  08:45 Найти цитируемый пост)
Наводит на мысль, что на втором шаге прийдется делать как минимум
obj.attributes.merge!(params[:object])

Ну и на мою write_attributes, скорее всего прийдется навешивать еще вызов чего-то вроде valid_for_attributes?(*attrs) 

Ну надо же, какой упорный велосипедостроитель... smile 
Какая религия тебе запрещает посмотреть на код метода ActiveRecord::Base#attributes=() ? 
Твой write_attributes до стандартного attributes= ещё пилить и пилить... вот только какой смысл?

Автор: rax 25.10.2010, 13:40
Если человек забросит заполнение на первом шаге, в базе будет куча мусора

Автор: source777 25.10.2010, 17:26
Цитата(rax @  25.10.2010,  13:40 Найти цитируемый пост)
Если человек забросит заполнение на первом шаге, в базе будет куча мусора 

Ну это как сказать, многие считают очень ценной информацию о том на каком шаге пользователи забрасывают некий процесс, гораздо более ценной, чем лишние 5-10 Мб места в БД. Хотя если твой случай никак не связан с бизнесом, и пользователям не предоставляется возможность возобновить процесс заполнения(что в большинстве случаев будет багом юзабилити), то можно и не сохранять такие записи.

Автор: rax 26.10.2010, 11:37
Разобрался. Есть @foo.attributes.keys и Foo.column_names. Дальше update

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)