Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Расширение модели 
:(
    Опции темы
Kich
Дата 10.12.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 9.12.2008

Репутация: нет
Всего: нет



Суть в следующем. Модели ActiveRecord
Есть модель пользователя (User). Есть модель "Comments" которая через ассоциации подключает в себя "users", но ассоциация users должна брать методы из модели User (таблица users) + расширять их столбцами из другой модели (таблица comment_users).
Вопрос собственно в следующем. Как это реализовать? Я знаю, что руби динамический язык и умеет расширять классы. Мне то в принципе и надо по-сути расширить модель. Главный вопрос -  How?
PM MAIL   Вверх
shine
Дата 10.12.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 20.10.2006

Репутация: 2
Всего: 5



Знаете, если вы напишете пример кода который вы хотите чтобы работал и опишете что этот код должен в результате делать нам (или, как минимум, мне) будет проще понять что вы спрашиваете.
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
Kich
Дата 11.12.2008, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 9.12.2008

Репутация: нет
Всего: нет



shine
Ну если бы я знал код, который работал я нестал бы создавать тему на форуме. Если б я знал, что предполагаемый код должен работать, но по какойто причине не работает - я бы искал информацию в мануале или API
А так есть только исходные данные:

user.rb
Код

class User < ActiveRecord::Base
 has_many ...
 has_one ...
 belong_to ...
end


Есть другая модель

comment.rb

Код

class Comment < ActiveRecord::Base
 has_one :user, class_name => "User"
end

class User < ActiveRecord::Base
self.table_name = "comment_users"
belong_to :comment
end


ну или... как предположение:
Код

class User < ActiveRecord::Base
 class << self
   set_table_name = "comment_users"
    belong_to :comment
 end
end


Задача этой всей канетели:
Расширение модели. А именно:
1. "дописывание" а возможно переопределение методов и свойств модели в зависимости от контроллера и/или модели в которой мы находимся
2. обращение делать не через ассоциации а как сублимацию(объединение, склеивание, join) двух таблиц в рамках одной модели ( users и  comment_users ).

Зачем это надо?
1. Постижение динамичной природы Руби
2. гибкость
3. удобство
4. принцип DRY
 

Это сообщение отредактировал(а) Kich - 11.12.2008, 01:05
PM MAIL   Вверх
shine
Дата 11.12.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 20.10.2006

Репутация: 2
Всего: 5



Цитата(Kich @ 11.12.2008,  00:54)
1. "дописывание" а возможно переопределение методов и свойств модели в зависимости от контроллера и/или модели в которой мы находимся

Идея следующая. В руби мы можем добавлять методы в объект на лету. Например, у нас есть класс A и три объекта этого класса: obj1, obj2 и obj3. Кроме того у нас есть модуль B с функциями fun1 и fun2 smile

Если мы выполним obj2.extend(B), то функции fun1 и fun2 станут определены в obj2, но не в obj1 и obj3. То есть мы добавляем модуль в конкретный объект.

Имя класса контроллера вы элементарно получаете в любом экшене этого контроллера. Если добавить в объект примерно такой метод

Код

def is_used_in controller_name
  module_name = case controller_name
                              when PostsController: ModuleNameForPostsController
                              when UsersController: ModuleNameForUsersController
                            end

  extend(module_name)
end


То в контроллерах можно делать что-то такое:
Код

  def index
    @comments = Comment.find :all, :conditions => 'id < 20'
    @comments.each{|comment| comment.is_used_in(self.class.to_s)}
  end


Это подойдет если нужно чтобы сам объект руководил каким образом он должен изменяться в зависимости от контекста. Если же данные об этом должны приходить извне то тут вместо передачи в объект имени модуля передаем туда блок с нужными инструкциями.

Ну а про объединение нескольких таблиц в одну модель я ничего не подскажу.

Это сообщение отредактировал(а) shine - 11.12.2008, 15:51
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby on Rails"
source777
  • С чего начать? начинаем
  • Документацию смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby On Rails | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.