2012-04-10 9 views
5

Dies ist mein Code für Daten von meinem alten Datenbank zu bewegen:Ruby on Rails, has_many definieren Klassenname für polymorphe Beziehung

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 

Wenn ich den folgenden Code

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

Es führt diese laufen SQL

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

Das Problem ist, dass ich bekommen:

`storage_type` = 'Old::Recipe' 

Aber ich brauche:

`storage_type` = 'Recipe' 

Wie kann ich die Klasse für eine polymorphe Beziehung ändern?

Das Dokument für has_many gibt mir keine Antwort.

+0

Gibt es einen Grund, warum die Rezeptklasse in der Klasse Old verschachtelt ist? – pixeltrix

+0

Vielleicht wurde dies in eine Rails Engine @pixeltrix verschoben. Hat jemand eine bessere Antwort dafür? – Jwan622

Antwort

0

Leider, denn jetzt habe ich nur einen Weg, das zu tun:

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 

sehr sehr traurig

+0

Hat der obige Kommentar nicht funktioniert? – Jwan622

1

Vor kurzem hatte ich ähnliches Problem, das ist eine Lösung, die in Schienen für mich gearbeitet 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 

Sie müssen unscope(:where) hinzufügen, um die Bedingung uploaded_files.storage_type = 'Old::Recipe' aus der Abfrage zu entfernen.

+0

funktioniert das? – Jwan622

Verwandte Themen