Форум программистов, компьютерный форум, киберфорум
Ruby on Rails
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 29.12.2015
Сообщений: 3
1

Rails. Доступ к полям связанной таблицы. Имя связанной модели и поля в переменных

30.12.2015, 00:15. Показов 2903. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, добрым людям!
Вероятно ответ прост, однако найти его сам оперативно не смог.
Есть две модели.

tickers
Id
Name
Sector_id
belongs_to :sector

sectors
Id
name
has_many :tickers


Получить название сектора (sectors.name) по первой строке таблицы tickers, можно так:
t = Ticker.first
t.sector.name

Вопрос: как получить данное значение, если и название модели 'sector' и искомого поля в ней 'name' еще не известно, а хранятся в переменных (например, model_name и field_name)?

Заранее благодарен!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2015, 00:15
Ответы с готовыми решениями:

Имя связанной таблицы
Есть таблица в одной базе с именем 'X'. С ней установлена связь из другой базы с именем 'Y'. Как во...

Сумма значений поля связанной таблицы
Здравствуйте. Помоги разобраться: Есть 2 связанные таблицы ФИО и Работа В таблице ФИО 2 поля :...

Занесение значения поля из связанной таблицы другому полю
Есть две таблицы DataTable - основная с именем DT_MAIN, в составе которой есть поля KEY и VL, и...

Как определить, что поле - внешний ключ, и узнать имя связанной с ним таблицы?
Здравствуйте! Идет перебор полей в ADOQuery: for i=0 to ADOQuery1.FieldCount-1 do // ...как...

4
the hardway first
Эксперт JS
2461 / 1836 / 906
Регистрация: 05.06.2015
Сообщений: 3,603
30.12.2015, 02:35 2
Voljka, надо было разместить тему в ветке Rails.
Цитата Сообщение от Voljka Посмотреть сообщение
если и название модели 'sector' еще не известно
Связи можно узнать рефлексией, (на примере вашей модели, где :belong_to одна и только одна), да и метод #name еще не продумал как найти (пусть нам будет известно, что это #name), то
Rails
1
2
3
model_association = Ticker.reflect_on_all_associations(:belongs_to)
t = Ticker.first
sector_name = t.send(model_association.map(&:name).first).name
Если найдете решение как найти нужный метод для получения необходимого аттрибута, отпишите нам пожалуйста.
Rails
1
2
associated_model_attrs = t.send(model_association.map(&:name).first).attributes
# how to find necessary attribute?
1
0 / 0 / 0
Регистрация: 29.12.2015
Сообщений: 3
30.12.2015, 05:58  [ТС] 3
Спасибо большое!
Этот способ помог.
'name' в моем примере - имя поля в таблице, а не метод (хотя я возможно не очень точно знаю определения, принятые в Ruby).
сохранив в seсtor_name всю запись
Ruby
1
sector_name = t.send(model_association.map(&:name).first)
выделить в ней нужное поле задача несложная
Ruby
1
2
field_name='name'
req_value = sector_name[field_name]
Уверен, что Вас интересовал именно метод, а мой ответ лишь улыбнул )
Если найду ответ возможность передачи метода, отпишусь.

Добавлено через 39 минут
j2FunOnly,
Теперь задача получить как-то модель Ticker ))
Дело в том, что в метод могут передаваться записи разных моделей.
В helper у меня есть только экземпляр этой модели (запись т.е.)
Есть способ решения этой задачи, имея в методе только эти данные?
Я решил задачу путем создания в контроллере переменной @model_class = Ticker
и далее использовал Вами предложенный метод.
Rails
1
model_association = @model_class.reflect_on_all_associations(:belongs_to)
и т.д.

Добавлено через 1 час 55 минут
j2FunOnly,
Все оказалось намного проще.
Я искал именно send.
Что им подставлять - не важно
В моем примере можно обойти без reflection
Rails
1
2
3
4
model_name='sector'
field_name='name'
t = Ticker.first
desired_value = t.send(model_name).send(field_name)
Причем похоже, что передавать можно как текст, так и символ.
То же справедливо и для указание метода с помощью send.
0
the hardway first
Эксперт JS
2461 / 1836 / 906
Регистрация: 05.06.2015
Сообщений: 3,603
30.12.2015, 08:07 4
Значит я не до конца понял условие
Цитата Сообщение от Voljka Посмотреть сообщение
если и название модели 'sector' и искомого поля в ней 'name' еще не известно, а хранятся в переменных (например, model_name и field_name)?
А оказывается вам всё известно. В Ruby это называется метапрограммированием.
И раз уж вы не знали о Object#send, посмотрите Object#respond_to?, чтобы избежать NoMethodError. И почитайте Paolo Perrotta - Metaprogramming Ruby 2 Program Like the Ruby Pros, там много интересного.
1
0 / 0 / 0
Регистрация: 29.12.2015
Сообщений: 3
02.01.2016, 20:55  [ТС] 5
В любом случае ответ я получил.
Да и полезно было полазить в Reflection. Я новичок в Ruby. Сейчас, чтобы изучение было изучение, ERP переписываю на Ruby.
У меня беда с терминами. Я часто как Остап Бендер, который не знает, что применяет какую-то заумную "комбинацию". Оказывается то, что я использовал первый раз в FoxPro 2.0 еще в 1996, называется "метапрограммирование" )
Книгу скачал. Почитаю
Cпасибо
0
02.01.2016, 20:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2016, 20:55
Помогаю со студенческими работами здесь

При выборе из Ad модели выбрать по кол-ву в связанной модели ad_images
Всем привет В laravel 6 с фильтром из таблицы ads и хочу установить условие чтобы возвращались...

Выбор в таблице данных модели ссылки на экземпляр связанной модели
Есть ли какой-то автоматизированный способ вывести на страницу таблицу с записями модели, одно из...

MVC 5. Передать название бренда связанной модели, а не идентификатор
Здравствуйте, возникла следующая проблема: Нужно чтобы в представление Каталога товаров...

Конструирование url, ссылки в шаблоне и выборка из связанной модели
Есть приложение blog, в нем есть связанные модели Category, SubCategory, Post. В шаблонах...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru