使用ActiveRecord序列化数据库中的现有字符串

时间:2017-01-06 22:37:24

标签: ruby-on-rails

我在mysql数据库中有一个文本字段,我使用ActiveRecord作为哈希序列化:

<Window x:Class="ToggleButtonStyle.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ToggleButtonStyle"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <!-- <ResourceDictionary Source="Dictionary1.xaml" /> -->
    <!-- main color of buttons-->
    <Color x:Key="MainThemeColor">Orange</Color>

    <!-- hover-over color for buttons -->
    <Color x:Key="MouseOverColor">Purple</Color>

    <!-- 5. Mouse over background color for step buttons -->
    <SolidColorBrush x:Key="MouseOverBackgroundBrush" Color="{DynamicResource MouseOverColor}"/>

    <!-- 6. Background color active step -->
    <SolidColorBrush x:Key="CheckedBackgroundBrush" Color="{DynamicResource MainThemeColor}"/>

    <Style TargetType="{x:Type ToggleButton}" x:Key="ToggleButtonStyle">
        <Setter Property="Background" Value="White" />
        <Setter Property="Foreground" Value="Black" />
        <Setter Property="Width" Value="Auto"/>
        <Setter Property="Height" Value="40"/>
        <Setter Property="FontSize" Value="13"/>
        <Setter Property="MinWidth" Value="80"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToggleButton}">
                    <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness ="{TemplateBinding BorderThickness}" Padding="5" Margin="2">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BorderBrush" Value="{StaticResource CheckedBackgroundBrush}" />
                <Setter Property="Background" Value="{StaticResource MouseOverBackgroundBrush}" />
                <Setter Property="Foreground" Value="#333333" />
            </Trigger>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="BorderBrush" Value="{StaticResource MouseOverBackgroundBrush}"/>
                <Setter Property="Background" Value="{StaticResource CheckedBackgroundBrush}" />
                <Setter Property="Foreground" Value="#ffffff"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <StackPanel Orientation="Horizontal">
        <ToggleButton Style="{DynamicResource ToggleButtonStyle}">Button 1</ToggleButton>
        <ToggleButton Style="{DynamicResource ToggleButtonStyle}">Button 2</ToggleButton>
        <ToggleButton Style="{DynamicResource ToggleButtonStyle}">Button 3</ToggleButton>
    </StackPanel>
</Grid>

当我将ActiveRecord对象保存到数据库时,该文本字段被正确序列化并存储。当我调用该属性时,Rails正确地将其转换为哈希值。

数据库中的字段如下所示:

class Record < ActiveRecord::Base
  serialize :mail_validation, Hash
end

但是,我在数据库中有现有记录,显然没有序列化。它看起来像这样:

mail_validation: ---
:metadata:
  :county_name: Bucks

当我尝试调用该记录的mail_validation属性时,它将结果作为字符串而不是哈希返回。 (返回该属性的字符串的记录是从旧数据库导入的。)

如何在调用该属性时确保所有记录都返回哈希值?

1 个答案:

答案 0 :(得分:0)

运行此脚本:

records = Record.where("mail_validation NOT LIKE '---%'") # all string values
records.each do |record|
  # remove braces
  mail_validation = record.mail_validation.gsub(/(\{ | \})/, '')
  # split on key-value pairs
  mail_validation = mail_validation.split(', ')
  # make hash
  mail_validation = mail_validation.map { |pair| pair.split(': ') }.to_h
  # hack to avoid ActiveRecord::SerializationTypeMismatch error
  Record.where(id: record.id).update_all(mail_validation: mail_validation)
end