| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Ruby On Rails > Расширение модели |
| Автор: Kich 10.12.2008, 13:54 |
| Суть в следующем. Модели ActiveRecord Есть модель пользователя (User). Есть модель "Comments" которая через ассоциации подключает в себя "users", но ассоциация users должна брать методы из модели User (таблица users) + расширять их столбцами из другой модели (таблица comment_users). Вопрос собственно в следующем. Как это реализовать? Я знаю, что руби динамический язык и умеет расширять классы. Мне то в принципе и надо по-сути расширить модель. Главный вопрос - How? |
| Автор: shine 10.12.2008, 23:38 |
| Знаете, если вы напишете пример кода который вы хотите чтобы работал и опишете что этот код должен в результате делать нам (или, как минимум, мне) будет проще понять что вы спрашиваете. |
| Автор: Kich 11.12.2008, 00:54 | ||||||
| shine Ну если бы я знал код, который работал я нестал бы создавать тему на форуме. Если б я знал, что предполагаемый код должен работать, но по какойто причине не работает - я бы искал информацию в мануале или API А так есть только исходные данные: user.rb
Есть другая модель comment.rb
ну или... как предположение:
Задача этой всей канетели: Расширение модели. А именно: 1. "дописывание" а возможно переопределение методов и свойств модели в зависимости от контроллера и/или модели в которой мы находимся 2. обращение делать не через ассоциации а как сублимацию(объединение, склеивание, join) двух таблиц в рамках одной модели ( users и comment_users ). Зачем это надо? 1. Постижение динамичной природы Руби 2. гибкость 3. удобство 4. принцип DRY |
| Автор: shine 11.12.2008, 15:50 | ||||||
Идея следующая. В руби мы можем добавлять методы в объект на лету. Например, у нас есть класс A и три объекта этого класса: obj1, obj2 и obj3. Кроме того у нас есть модуль B с функциями fun1 и fun2 Если мы выполним obj2.extend(B), то функции fun1 и fun2 станут определены в obj2, но не в obj1 и obj3. То есть мы добавляем модуль в конкретный объект. Имя класса контроллера вы элементарно получаете в любом экшене этого контроллера. Если добавить в объект примерно такой метод
То в контроллерах можно делать что-то такое:
Это подойдет если нужно чтобы сам объект руководил каким образом он должен изменяться в зависимости от контекста. Если же данные об этом должны приходить извне то тут вместо передачи в объект имени модуля передаем туда блок с нужными инструкциями. Ну а про объединение нескольких таблиц в одну модель я ничего не подскажу. |