2012-04-10 13 views
5

To jest mój kod do przenoszenia danych ze starego bazy danych:Ruby on Rails, has_many zdefiniować nazwę klasy dla polimorficznych relacji

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 

Kiedy uruchomić następujący kod

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

on wykonuje to SQL

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

problemem jest to, że otrzymujemy:

`storage_type` = 'Old::Recipe' 

Ale muszę:

`storage_type` = 'Recipe' 

Jak mogę zmienić klasę na polimorficznych związku?

Dokument dla has_many nie daje mi odpowiedzi.

+0

czy istnieje powód, dla którego klasa Receptura jest zagnieżdżona wewnątrz Starej klasy? – pixeltrix

+0

Być może został on przeniesiony do Rails Engine @pixeltrix. Czy ktoś ma lepszą odpowiedź? – Jwan622

Odpowiedz

0

Niestety, na razie znalazłem tylko jeden sposób, aby to zrobić:

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 

bardzo smutny

+0

Czy powyższy komentarz nie działa? – Jwan622

1

Ostatnio miałem podobny problem, jest to rozwiązanie, które pracował dla mnie w szynach 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 

Musisz dodać unscope(:where), aby usunąć warunek uploaded_files.storage_type = 'Old::Recipe' z zapytania.

+0

to działa? – Jwan622