2012-04-10 16 views
5

Este es mi código para mover datos de mi antigua base de datos:Ruby on Rails, has_many, definir nombre de la clase de relación polimórfica

class Old < ActiveRecord::Base 
    establish_connection :old_version 
    self.abstract_class = true 

    class Recipe < self 
    set_table_name :recipes 
    has_many :uploaded_files, :as => :storage 
    end 

    class UploadedFile < self 
    set_table_name :uploaded_files 
    belongs_to :storage, :polymorphic => true 
    end 
end 

Cuando ejecuto el siguiente código

Old::Recipe.all.each do |recipe| 
    puts recipe.uploaded_files.to_sql 
end 

Realiza esta SQL

SELECT `uploaded_files`.* FROM `uploaded_files` WHERE `uploaded_files`.`storage_id` = 38 AND `uploaded_files`.`storage_type` = 'Old::Recipe' 

El problema es que me sale:

`storage_type` = 'Old::Recipe' 

pero necesito:

`storage_type` = 'Recipe' 

¿Cómo puedo cambiar la clase para una relación polimórfica?

El doc para has_many no me da una respuesta.

+0

¿Hay alguna razón por la cual la clase Recipe está anidada dentro de la clase Old? – pixeltrix

+0

Quizás esto se haya trasladado a Rails Engine @pixeltrix. Alguien tiene una mejor respuesta para esto? – Jwan622

Respuesta

0

Desafortunadamente, por ahora sólo he encontrado una manera de hacer eso:

class Old < ActiveRecord::Base 
    establish_connection :old_version 
    self.abstract_class = true 

    class Recipe < self 
    set_table_name :recipes 
    has_many :old_files, 
      :class_name => 'UploadedFile', 
      :finder_sql => Proc.new { 
       %Q{ 
        SELECT uploaded_files.* 
        FROM uploaded_files 
        WHERE uploaded_files.storage_id = #{id} AND 
         uploaded_files.storage_type = 'Recipe' 
       } 
       } 
    end 

    class UploadedFile < self 
    set_table_name :uploaded_files 
    belongs_to :storage, :polymorphic => true 
    end 
end 


namespace :old do 
    task :menu => :environment do 
    Old::Recipe.all.each do |recipe| 
     puts '~' * 50 
     puts recipe.id 
     recipe.old_files.to_a.each do |file| 
     puts file.storage_id, file.storage_type 
     end 
    end 
    end 
end 

muy muy triste

+0

¿No funcionó el comentario anterior? – Jwan622

1

Recientemente he tenido un problema similar, esta es una solución que funcionó para mí en los carriles 4.2:

class Recipe < self 
    set_table_name :recipes 
    has_many :old_files, -> (object) { unscope(where: :storage_type).where(storage_type: 'Recipe') }, class_name: 'UploadedFile' 
end 

Tienes que agregar unscope(:where) para eliminar la condición uploaded_files.storage_type = 'Old::Recipe' de la consulta.

+0

hace esto? – Jwan622

Cuestiones relacionadas