the*_*her 5 polymorphism ruby-on-rails class has-many
这是我从旧数据库中移动数据的代码:
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
Run Code Online (Sandbox Code Playgroud)
当我运行以下代码时
Old::Recipe.all.each do |recipe|
puts recipe.uploaded_files.to_sql
end
Run Code Online (Sandbox Code Playgroud)
它执行此SQL
SELECT `uploaded_files`.* FROM `uploaded_files` WHERE `uploaded_files`.`storage_id` = 38 AND `uploaded_files`.`storage_type` = 'Old::Recipe'
Run Code Online (Sandbox Code Playgroud)
问题是我得到:
`storage_type` = 'Old::Recipe'
Run Code Online (Sandbox Code Playgroud)
但是我需要:
`storage_type` = 'Recipe'
Run Code Online (Sandbox Code Playgroud)
如何更改多态关系的类?
doc for doc has_many没有给我一个答案.
最近我遇到了类似的问题,这是在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
Run Code Online (Sandbox Code Playgroud)
您必须添加unscope(:where)才能uploaded_files.storage_type = 'Old::Recipe'从查询中删除条件。
不幸的是,目前我发现只有一种方法可以做到这一点:
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
Run Code Online (Sandbox Code Playgroud)
非常非常悲伤