039_serialize_blog_attributes.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:5k
源码类别:

Ajax

开发平台:

Others

  1. class SerializeBlogAttributes < ActiveRecord::Migration
  2.   class BareSetting < ActiveRecord::Base
  3.     include BareMigration
  4.     belongs_to :blog, :class_name => "SerializeBlogAttributes::BareBlog"
  5.   end
  6.   class BareBlog < ActiveRecord::Base
  7.     include BareMigration
  8.     serialize :settings
  9.     class SettingSpec
  10.       attr_accessor :key, :type, :default
  11.       def initialize(key, type, default)
  12.         self.key     = key
  13.         self.type    = type
  14.         self.default = default
  15.       end
  16.       def normalize_value(line)
  17.         if !line || line.value.nil?
  18.           return default
  19.         end
  20.         value = line.value
  21.         case type
  22.         when :boolean
  23.           ! value.match(/^(?:f(?:alse)?|0|)$/)
  24.         when :integer
  25.           value.to_i
  26.         when :string
  27.           value
  28.         else
  29.           YAML::load(value)
  30.         end
  31.       end
  32.       def stringify_value(value)
  33.         case type
  34.         when :boolean
  35.           value.to_s
  36.         when :integer
  37.           value.to_s
  38.         when :string
  39.           value
  40.         else
  41.           value.to_yaml
  42.         end
  43.       end
  44.     end
  45.     def self.fields(key = nil)
  46.       @@fields ||= { }
  47.       key ? @@fields[key.to_sym] : @@fields
  48.     end
  49.     def self.setting(key, type, default)
  50.       fields[key.to_sym] = SettingSpec.new(key.to_sym, type, default)
  51.     end
  52.     # Description
  53.     setting :blog_name,                  :string, 'My Shiny Weblog!'
  54.     setting :blog_subtitle,              :string, ''
  55.     setting :geourl_location,            :string, ''
  56.     # Spam
  57.     setting :sp_global,                  :boolean, false
  58.     setting :sp_article_auto_close,      :integer, 0
  59.     setting :sp_allow_non_ajax_comments, :boolean, true
  60.     setting :sp_url_limit,               :integer, 0
  61.     # Podcasting
  62.     setting :itunes_explicit,            :boolean, false
  63.     setting :itunes_author,              :string, ''
  64.     setting :itunes_subtitle,            :string, ''
  65.     setting :itunes_summary,             :string, ''
  66.     setting :itunes_owner,               :string, ''
  67.     setting :itunes_email,               :string, ''
  68.     setting :itunes_name,                :string, ''
  69.     setting :itunes_copyright,           :string, ''
  70.     # Mostly Behaviour
  71.     setting :text_filter,                :string, ''
  72.     setting :comment_text_filter,        :string, ''
  73.     setting :limit_article_display,      :integer, 10
  74.     setting :limit_rss_display,          :integer, 10
  75.     setting :default_allow_pings,        :boolean, false
  76.     setting :default_allow_comments,     :boolean, true
  77.     setting :link_to_author,             :boolean, false
  78.     setting :show_extended_on_rss,       :boolean, true
  79.     setting :theme,                      :string, 'azure'
  80.     setting :use_gravatar,               :boolean, false
  81.     setting :ping_urls,                  :string, "http://rpc.technorati.com/rpc/pingnhttp://ping.blo.gs/nhttp://rpc.weblogs.com/RPC2"
  82.     setting :send_outbound_pings,        :boolean, true
  83.     setting :email_from,                 :string, 'scott@sigkill.org'
  84.     # Jabber config
  85.     setting :jabber_address,             :string, ''
  86.     setting :jabber_password,            :string, ''
  87.   end
  88.   def self.up
  89.     add_column :blogs, :settings, :text
  90.     unless $schema_generator
  91.       begin
  92.         BareSetting.transaction do
  93.           BareBlog.find(:all).each do |blog|
  94.             blog.settings = { }
  95.             BareSetting.with_scope(:find => { :conditions => "blog_id = #{blog.id}"}) do
  96.               BareBlog.fields.each do |key, spec|
  97.                 next unless setting = BareSetting.find_by_name(key.to_s, :limit => 1)
  98.                 blog.settings[key.to_s] =
  99.                   spec.normalize_value(setting)
  100.                 BareSetting.delete(setting.id)
  101.               end
  102.             end
  103.             blog.save
  104.           end
  105.         end
  106.       rescue Exception => e
  107.         remove_column :blogs, :settings rescue nil
  108.         raise e
  109.       end
  110.     end
  111.     drop_table :settings
  112.   end
  113.   def self.down
  114.     begin
  115.       create_settings
  116.       unless $schema_generator
  117.         BareSetting.transaction do
  118.           BareBlog.find(:all).each do |blog|
  119.             blog.settings ||= { }
  120.             BareSetting.with_scope(:create => { :blog_id => blog.id }) do
  121.               BareBlog.fields.each do |key, spec|
  122.                 next unless blog.settings.has_key?(key.to_s)
  123.                 BareSetting.create!(:name => key.to_s,
  124.                                     :value => spec.stringify_value(blog.settings[key.to_s]))
  125.               end
  126.             end
  127.           end
  128.         end
  129.       end
  130.       remove_column :blogs, :settings rescue nil
  131.     rescue Exception => e
  132.       drop_table :settings rescue nil
  133.       raise e
  134.     end
  135.   end
  136.   def self.create_settings
  137.     create_table :settings do |t|
  138.       t.column :name,     :string, :limit => 255
  139.       t.column :value,    :string, :limit => 255
  140.       t.column :position, :integer
  141.       t.column :blog_id,  :integer
  142.     end
  143.   end
  144. end