5

これは、古いデータベースからデータを移動するためのコードです。

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

次のコードを実行すると

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

このSQLを実行します

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

問題は私が得ることです:

`storage_type` = 'Old::Recipe'

しかし、私は必要です:

`storage_type` = 'Recipe'

ポリモーフィック関係のクラスを変更するにはどうすればよいですか?

のドキュメントはhas_many私に答えを与えません。

4

3 に答える 3

9

最近、同様の問題が発生しました。これは、Rails 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

クエリからunscope(:where)条件を削除するには、追加する必要があります。uploaded_files.storage_type = 'Old::Recipe'

于 2015-05-20T11:42:51.140 に答える
3

上記のsantuxusによる回答は、Rails 4.2+で適切に機能しています

ただし、以前のバージョンでは、次のように関連付けを上書きしてみることができます。

class Recipe
  has_many :uploaded_files, conditions: { storage_type: 'Recipe' }, foreign_key: :storage_id
end
于 2019-03-26T10:00:43.433 に答える
0

残念ながら、今のところ、それを行う方法は 1 つしか見つかりませんでした。

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

とてもとても悲しい

于 2012-04-10T16:43:08.247 に答える