Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Demonstrate validation of arbitrary fields (e.g., hstore)
#!/usr/bin/env ruby
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:database => ':memory:'
)
ActiveRecord::Schema.define do
create_table :documents, :force => true do |t|
end
end
module HstoreValidation
def validates_hstore(field, &block)
validation_class = Class.new do
include ActiveModel::Validations
def self.name
'(validations)'
end
def initialize(data)
@data = data
end
def read_attribute_for_validation(attr_name)
@data[attr_name]
end
end
validation_class.class_eval &block
validate do
validator = validation_class.new(self[field])
if validator.invalid?
validator.errors.each do |attr, text|
self.errors.add(attr, text)
end
end
end
end
end
class Document < ActiveRecord::Base
extend HstoreValidation
validates_hstore :data do
validates_length_of :title, :maximum => 50
end
end
d = Document.new
d[:data] = {title: 'abc' * 51}
p d.valid?
p d.errors
d[:data][:title] = 'shorter title'
p d.valid?
p d.errors
@bezelga

This comment has been minimized.

Show comment
Hide comment
@bezelga

bezelga May 2, 2014

by the time, Rails does not have anything built in to validate hstore fields?

bezelga commented May 2, 2014

by the time, Rails does not have anything built in to validate hstore fields?

@rf-

This comment has been minimized.

Show comment
Hide comment
@rf-

rf- May 12, 2014

For most use cases, it would be better now to use store_accessor and just write normal validations.

Owner

rf- commented May 12, 2014

For most use cases, it would be better now to use store_accessor and just write normal validations.

@holden

This comment has been minimized.

Show comment
Hide comment
@holden

holden Aug 22, 2014

This seems to no longer work on Rails 4.1 ;-(

holden commented Aug 22, 2014

This seems to no longer work on Rails 4.1 ;-(

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment