Q: как делиться информацией во родительских классах о родительском классе
class Post
MODEL = self
extend PostMod
has_many :comments, :class_name => 'Post::Comment'
class Comment
include CommentMod
belongs_to :model, :class_name => "Post"
def method_in_comment
puts MODEL
end
end
class Another
end
end
module CommentMod
def method_in_mod1
puts self.class::MODEL
end
def method_in_mod2
puts MODEL
end
end
module PostMod
def method_in_mod1
puts self::Comment
end
end
b = Post::Comment.new
b.method_in_comment # Post
b.method_in_mod1 # uninitialized constant Post::Comment::MODEL (NameError)
b.method_in_mod2 # uninitialized constant CommentMod::MODEL (NameError)
Причина такого дизайна, в данном примере (реальная система намного сложнее), состоит в том, чтобы добавлять комментарии к любой модели, просто«включить модуль».Это добавит контроллеры, представления и методы модели.
. Комментарии ведут себя одинаково для всех моделей.Но модель может переопределить любой метод в классе Comment, если нужно что-то настроить.
Хитрая часть в том, что модули ничего не знают о верхних классах (Post) и классах на одном уровне (Comment и Another),но им нужно вызвать некоторые методы класса для них.
Сейчас я использую синтаксический анализ class.name, чтобы получить имя класса верхнего уровня, но должны быть другие способы.
Любые предложения приветствуются, включая изменение дизайна.
ОБНОВЛЕНИЕ
Сообщения и комментарии являются лишь примером, у меня нет этих моделей в моемproject.
Я перехожу с обозначения подчеркивания (или CamelCase) на вложенные классы (из ArticleTranslation в Article :: Translation).Это выглядит более понятным для меня.В предыдущей версии я использовал имя модели для вызова методов класса в классах (в ModelTranslation и т. Д.) Теперь, после рефакторинга lib модулей, мне больше не нужно знать имя_модели.
Но я попал в ловушку:ruby, вы можете снова открыть классы, например
class Post < ActiveRecord::Base
end
class Post::Comment < ActiveRecord::Base
belongs_to :language
end
class Post::Comment::Another1 < ActiveRecord::Base
end
class Post::Comment::Another2 < ActiveRecord::Base
end
class Language < ActiveRecord::Base
has_many :post_comments, :class_name => "Post::Comment"
end
И у меня есть проблема: если страница была загружена сразу после запуска сервера - все в порядке, но при следующих вызовах этой страницы выдается ошибка: нет такой ассоциации;вызов методов включенных модулей - ошибок метода нет.Я думаю, что rails загружает неверный файл для Post :: Coment, хуже всего то, что я не могу отладить эту ошибку ... но это другой вопрос.
UPDATE2
Вторая проблема решена.Проблема была в вспомогательных классах.