Ruby on rails RubyonRails为多态关系定义了许多类名
这是我从旧数据库中移动数据的代码:Ruby on rails RubyonRails为多态关系定义了许多类名,ruby-on-rails,class,polymorphism,has-many,Ruby On Rails,Class,Polymorphism,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 &l
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
它执行这个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'
如何更改多态关系的类
医生没有给我答案。不幸的是,目前我只找到了一种方法:
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
非常非常悲哀最近我遇到了类似的问题,这是一个在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来从查询中删除上传的条件文件。存储类型='Old::Recipe'。以上santuxus的回答对于rails 4.2来说工作正常+ 但是,对于较低版本,您可以尝试覆盖关联,如下所示: 课堂食谱 有很多:上传的文件,条件:{storage\u type:'Recipe'},外键::storage\u id 终止
Recipe类嵌套在旧类中有什么原因吗?可能是因为它被移动到了Rails引擎@pixeltrix中。有人对此有更好的答案吗?这对我很有用,但仍然需要存储
class Recipe < self
set_table_name :recipes
has_many :old_files, -> (object) { unscope(where: :storage_type).where(storage_type: 'Recipe') }, class_name: 'UploadedFile'
end