Skip to content

Instantly share code, notes, and snippets.

@slenderock
Created April 3, 2017 18:34
Show Gist options
  • Save slenderock/ff94888039db48e7f27a8f4fbc718131 to your computer and use it in GitHub Desktop.
Save slenderock/ff94888039db48e7f27a8f4fbc718131 to your computer and use it in GitHub Desktop.
My solutions
# == Schema Information
#
# Table name: cms_base_blocks
#
# id :integer not null, primary key
# type :string
# data :json
# created_at :datetime not null
# updated_at :datetime not null
#
# Realization of getters and setters for database json field for STI relationship
class Cms::BaseBlock < ActiveRecord::Base
delegate :field_names, :fields, to: :class
after_initialize :set_default_values, if: :new_record?
class << self
def load
self.first || self.create!
end
def has_field field_name, options = {}
@fields ||= {}
@fields[field_name] = options
self.class_eval do
define_method "#{field_name}=" do |value|
data[field_name.to_s] = value
end
define_method field_name do
read_field field_name
end
end
end
def fields
@fields ||= {}
end
def field_names
fields.keys
end
end
protected
def set_default_values
data = {}
self.field_names.each{ |name| data[name]='' }
self.data = data
end
def read_field field_name
value = data[field_name.to_s]
value
end
end
# == Schema Information
#
# Table name: cms_base_blocks
#
# id :integer not null, primary key
# type :string
# data :json
# created_at :datetime not null
# updated_at :datetime not null
#
class Cms::MasterPage < Cms::BaseBlock
has_field :title
has_field :pre_description
has_field :description
has_field :video_url
has_field :video_description
has_field :image
validates_format_of :video_url, with: /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?/, if: :persisted?
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment