Ruby on Rails - переопределение процесса создания идентификатора ассоциации - PullRequest
0 голосов
/ 22 июля 2010

Я пытаюсь переопределить способ применения рельсов и идентификатор связанного объекта, например:

Есть две простые модели:

class Album < ActiveRecord::Base
  has_many :photos
end

class Photo < ActiveRecord::Base
  belongs_to :album
end

А потом я хочу сделать это:

album = Album.new :title => 'First Album'
album.photos.build
album.save #=> true

В этом случае я создал плагин, который переопределяет свойство id и заменяет его хешированной строкой, поэтому я хочу найти методы, в которых вместо этого album_id заменяется мой пользовательский метод вместо int и сможет конвертироваться до его сохранения. Но я хочу действовать глобально внутри структуры Rails, потому что, поскольку это будет своего рода плагин, я хочу, чтобы это действие работало на динамических моделях, поэтому я не могу создать before_save проверку для модели.

Я не уверен, что это легко понять, но я надеюсь, что кто-то может мне помочь в этом ..

Вот скриншот моей текущей таблицы, чтобы вы могли видеть, что происходит:

БД SQLite3 http://cl.ly/1j3U/content

Итак, как вы можете видеть album_id, он заменяется моим пользовательским объектом ruby ​​при его сохранении ... Я отключил плагин, а затем он нормально сохранился с записями 11 и 12 ...

Я хочу просто действовать на рельсы и конвертировать с помощью моих пользовательских методов, что-то вроде

def rails_association_replaced_method(record)
   #take the record associations and apply a to_i custom method before save
   super(record)
end

как то так:)

Ну, я надеюсь, что это не слишком сложно

Приветствия

Ответы [ 2 ]

1 голос
/ 01 августа 2010

Кажется, если я только переопределю метод ActiveRecord :: Base save, сделаю работу, если обработана правильно

define_method 'save' do
  int_fields = self.class.columns.find_all { |column| column.type == :integer }
  int_fields.each do |field|
    if self.attributes[field.name]
      self.attributes[field.name] = self.attributes[field.name].to_i
    end
  end
  super
end

И это заменит все целочисленные поля из текущей модели, применяя метод to_i к результату.

0 голосов
/ 22 июля 2010

Rails недружествен к такого рода изменениям по умолчанию. Какова ваша конечная цель здесь?

...