Skip to content

Instantly share code, notes, and snippets.

@avsej
Created February 21, 2014 08:45
Show Gist options
  • Select an option

  • Save avsej/9130803 to your computer and use it in GitHub Desktop.

Select an option

Save avsej/9130803 to your computer and use it in GitHub Desktop.
require 'active_record'
require 'logger'
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'test.sqlite3')
ActiveRecord::Schema.define do
create_table :users, force: true do |t|
t.string :first_name
t.string :last_name
t.string :role
end
end
class User < ActiveRecord::Base
def self.lookup(name, *roles)
filters = roles.map do |role|
field = (role == 'admin') ? :first_name : :last_name
arel_table.grouping(where(:role => role, field => name).where_values.reduce(:and))
end.reduce(:or)
where(filters)
end
end
User.create [{first_name: 'Sergey', last_name: 'Avseyev', role: 'admin'},
{first_name: 'User', last_name: 'Sergey', role: 'user'},
{first_name: 'Vasily', last_name: 'Pupkin', role: 'guest'}]
rel = User.lookup('Sergey', 'admin', 'user', 'guest')
puts rel.to_sql
puts rel.inspect
require 'irb'
silence_warnings { RAILS_DEFAULT_LOGGER = Logger.new(STDOUT) }
ActiveRecord::Base.logger = RAILS_DEFAULT_LOGGER if defined?(ActiveRecord)
IRB.start
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment