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: http://github.com/janne/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?

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs