module PostJson::Copyable::ClassMethods
Public Instance Methods
copy(destination_collection_name)
click to toggle source
# File lib/post_json/concerns/copyable.rb, line 6 def copy(destination_collection_name) destination = Collection[destination_collection_name] if exists? src_id = persisted_settings.id if destination.persisted? dest_id = destination.persisted_settings.id query = all_without_query_translator query = query.joins("INNER JOIN #{table_name} as dest ON dest.id = #{table_name}.id") query = query.where("dest.__doc__model_settings_id = '#{dest_id}'") query = query.where("\"#{table_name}\".__doc__model_settings_id = '#{src_id}'") query = query.where("dest.id = \"#{table_name}\".id") conflicting_ids = query.pluck("dest.id").join(", ") if conflicting_ids.present? error_message = "Following primary keys (#{primary_key}) already exists in collection \"#{destination.collection_name}\": #{conflicting_ids}." raise ActiveRecord::RecordNotUnique, error_message end end dest_id = destination.persisted_settings.id selectors = PostJson::Base.column_names.map { |s| s == "__doc__model_settings_id" ? "'#{dest_id}' as #{s}" : s }.join(", ") condition = "__doc__model_settings_id = '#{src_id}'" destination.transaction do destination.connection.execute("INSERT INTO #{table_name} (SELECT #{selectors} FROM #{table_name} WHERE #{condition})") end end destination end