LINUX.ORG.RU

ActiveRecord вывод всех полей по записи.


0

1

Создал две таблицы

Человеки (имя, телефоны)

Телефоны (номер, человек_id)

Связал

def Человек < ActiveRecord::Base
 has_many  :телефоны
end

def Телефон < ActiveRecord::Base
 belongs_to :человек
end

Далее получаю объект и хочу вывести список всех записей:

h = Человек.find(:first)
puts h.inspect # 1
puts h.телефоны.inspect # 2
puts h[:телефоны].inspect # 3

1. Вижу что h.inspect выводит только записи из таблицы Человек, без телефонов.

2. Работает правильно, выдаёт список телефонов

3. Не работает, выдаёт пустой список

Задача: получить ВСЮ информацию по человеку, как имя так и телефоны. Как это сделать без вызова метода с именем атрибута? Как частный случай: как правильно написать пункт 3, что бы было аналогично 2, только в качестве атрибута вызывать не метод с именем атрибута, а передавать имя атрибута в качестве параметра.

Иными словами, мне интересно, что бы код не знал что именно содержится в объекте класса Человек. То есть что то типо:

def out_put_info(obj)
 obj.each{|parm|
  case parm
  when Обычный параметр then puts parm.inspect
  when "Таблица типа belong_to" then out_put_info(parm)
  end
 }
end

obj = Человек.find(:first)
out_put_info(obj)

Иными словами выводить информацию по объекту со всеми связями. Знаю что в ActiveRecord это как-то можно сделать, но все поиски меня не привели к истине. Так что прошу помощи у вас.

Тыканье носом в нужную часть документации приветствуется, ссылку на главную страницу с описанием API давать смысла нет, google использовать умею.

★★

<offtopic>Поправьте заголовок темы и укажите, что тема про Ruby on Rails.</offtopic>

anonymous
()

Иными словами выводить информацию по объекту со всеми связями.

Что-то типа

hf = {}
human = Человек.find(:first)
hf[:human] = Человек.find(:first)
hf[:phones] = human.телефоны
p hf

А нафига?

Поправьте заголовок темы и укажите, что тема про Ruby on Rails.

AR можно и без RoR использовать.

iMp ★★★
()

> получить ВСЮ информацию по человеку, как имя так и телефоны. Как это сделать без вызова метода с именем атрибута?

попробуй Человек.find(:first).includes(:телефоны)


Как частный случай: как правильно написать пункт 3, что бы было аналогично 2, только в качестве атрибута вызывать не метод с именем атрибута, а передавать имя атрибута в качестве параметра.



h.__send__(:телефоны) ?

kelyar ★★★★★
()
Ответ на: комментарий от kelyar

h.__send__(:телефоны) ?

Гениально! Спасибо за идею. Что то сам до этого не додумался. Правда вместо __send__ лучше писать send, что бы не так извратно как на python получалось, не думаете? (это не троллинг, чисто интересно ваше мнение на этот счет)

Осталось только понять как получить список со всеми связями(в данном случае список: [:имя, :телефоны]). Мы же ведь не зря указываем has_many и belong_to... Если указали значит это где-то сохранилось и это можно вынуть, хотя в данном случае лучше уткнутся в документацию.

iMp> А нафига?

Пишу генератор GTK виджета на базе (TreeView) который должен в зависимости от объекта(или класса) из ORM создавать объект(или класс) на основе Gtk::TreeView. Если не иметь возможность доставать все данные о таблице из класса или на худой конец объекта, то получится нарушение ключевого правила: DRY.

В идеале должно получится что-то типо этого:

class GUI_Humans < GUI_TableGenerator
end

Оно поймёт что это Human таблица, вытащит из класса Human всю информацию, создаст соответствующие модели ListStore и TreeView. На практике это сейчас около 5 строк кода, которые описывают всё.

anonymous> Поправьте заголовок темы и укажите, что тема про Ruby on Rails.

А что такое Ruby On Rails?

ASM ★★
() автор топика
Ответ на: комментарий от ASM

> Правда вместо __send__ лучше писать send, что бы не так извратно как на python получалось, не думаете?


зависит от того, есть ли вероятность наличия какого-то кастомного метода send в коде.
если весь код свой, то, конечно, использую send.

kelyar ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.