ActiveRecord abstract_class and model inheritance

Hi everybody,

I’m having problems on a testcase that I’m working on. I hope that I can
explain the problem properly and that some of you can help me out
becouse I’m realy stuck on this one.

Ok, I have a Page model that needs to be multi lingual. Therefore I have
used a small but nice plugin: GitHub - janne/model_translations: Minimal implementation of Globalize2 style model translations
. Basically, I had to create a new model PageTranslation that conatains
the i18n attributes. Let me draw a small example:

Page

id
parent_id

PageTranslation

title

Now I want to use these object for the base of other objects. So I used
polymophisme on the page and page translation. Becouse of the
inheritance, I have created an abstract model for Page and
PageTranslation where other objects can inherit from. As an example
object, I’ll use a new object StaticPage. This is what I have so far:

class Page < ActiveRecord::Base
has_many :page_translations
belongs_to :content, :polymorphic => true
belongs_to :parent, :class_name => ‘Page’
has_many :children, :class_name => ‘Page’, :foreign_key => ‘parent_id’
end

class PageTranslation < ActiveRecord::Base
belongs_to :page
belongs_to :content_translation, :polymorphic => true
end

class PageModel < ActiveRecord::Base

self.abstract_class = true

has_one :page, :as => :content, :dependent => :destroy

validates_presence_of :page
validates_associated :page

after_save :save_page

translates :locale, :slug, :keywords, :description, :title, :content

Page.column_names.each do |attribute|
if attribute != “id”
define_method “#{attribute}=”.to_sym do |value|
init_page
self.page[“#{attribute}”] = value
end

  define_method "#{attribute}".to_sym do
    self.page[attribute] if self.page
  end
end

end

def children
self.page.children if self.page
end

private

def init_page
self.page = Page.new unless self.page
end

def save_page
self.page.save(false)
end
end

class PageTranslationModel < ActiveRecord::Base
self.abstract_class = true

has_one :page_translation, :as => :content_translation, :dependent =>
:destroy

validates_presence_of :page_translation
validates_associated :page_translation

after_save :save_page_translation

PageTranslation.column_names.each do |attribute|
if attribute != “id”
define_method “#{attribute}=”.to_sym do |value|
init_page_translation
self.page_translation[“#{attribute}”] = value
end

  define_method "#{attribute}".to_sym do
    self.page_translation[attribute] if self.page_translation
  end
end

end

private

def init_page_translation
self.page_translation = PageTranslation.new unless
self.page_translation
end

def save_page_translation
self.page_translation.save(false)
end
end

class StaticPage < PageModel
end

class StaticPageTranslation < PageTranslationModel
end

For testing, I’ve created a simple form like this:

<% form_for(@static_page, :url => static_pages_path , :html => { :id =>
“static-page-form” }) do |f| %>


<% end %>

This test works like a charm. The static page gets saved and the content
get synchronized with the page table. So that part works.

The part I can’t get to work, is the part with the translations.
I have used the model translation plugin on a simpler test case and got
it to work by adding the following to a model:
has_many :test_translations
after_update :save_translations

def new_translation_attributes=(translation_attributes)
translation_attributes.each do |attributes|
test_translations.build(attributes)
end
end

def existing_translation_attributes=(translation_attributes)
test_translations.reject(&:new_record?).each do |translation|
attributes = translation_attributes[translation.id.to_s]
if attributes
test_translation.attributes = attributes
else
test_translations.destroy(translation)
end
end
end

def save_translations
test_translations.each do |translation|
translation.save(false)
end
end
And have my form fields like this:

But I don’t seem to be able to implement this pattern in my abstract
PageModel.
It would be great if someone could help me out with this one, becouse I
don’t think I would be able to solve this without any help.

Thank you in advance

anyone?