Let spik with Rails!

The idea of this gem is experimenting with meta-programming abilities of Ruby. I want to talk with at first AR by imperative language.

Usage

This works fine only in production, because only in production we can get all models

Firstly I should tell you about syntax. It's not really recipe from all problems, but now we can tell something to Rails:

Model methods

  1. Execute scope method or model method with writing it in variable with generated name

    # regular variant:
    @scope_name_table_name = TableName.scope
    
    # with Spik:
    find scope_name [from] table_name
    # or
    scope_name [from] table_name
    

    for example with your table posts (and model Post with :popular scope):

    # regular variant:
    @popular_posts = Post.popular
    
    # with Spik:
    find popular posts
    # or
    popular posts
    # or
    find popular from posts
    
  2. Execute scope method or model method with writing it in variable with custom name

    # regular variant:
    @custom_variable_name = TableName.scope
    
    # with Spik:
    find scope_name [from] table_name as custom_variable_name
    # or
    scope_name [from] table_name as custom_variable_name
    

    for example with your table posts (and model Post with :popular scope):

    # regular variant:
    @my_posts = Post.popular
    
    # with Spik:
    find popular posts as my_posts
    # or
    popular posts as 'my_posts'
    # or
    find popular from posts as my_posts
    

Select

  1. Simple select from table:

    # regular variant:
    @table_name = TableName.find(:all)
    
    # with Spik:
    find all table_name
    

    for example with your table posts (and model Post):

    # regular variant:
    @posts = Post.find(:all)
    
    # with Spik:
    find all posts
    

    After this you have initiated instance variable in your controller @posts, and you can use it in your views and later in controller

  2. Select first row from your table:

    # regular variant:
    @table_name_row = TableName.find(:first)
    
    # with Spik:
    find first table_name_row
    

    for example with your table posts (and model Post):

    # regular variant:
    @post = Post.find(:first)
    
    # with Spik:
    find first post
    

    After this you have initiated instance variable in your controller @post, and you can use it in your views and later in controller

  3. Select rows from table with some condition:

    # regular variant:
    @table_name = TableName.find(:all, :conditions => ['attribute = ?', value])
    
    # with Spike:
    find all table_name (with|which has|which have|who have|who has) (attribute_name) (id as numeric|'string in quotes')
    

    for example with your table posts (and model Post) and table has attribute title:

    # regular variant:
    @posts = Post.find(:all, :conditions => ['title = ?', 'asdf'])
    
    # with Spik:
    find all posts with title 'asdf'
    

    After this you have initiated instance variable in your controller @posts, and you can use it in your views and later in controller

  4. Select rows from table with new name of instance variable:

    # regular variant:
    @what_you_want_your_variable_name = TableName.find(:all)
    
    # with Spik:
    find all table_name as what_you_want_your_variable_name (with|which has|which have|who have| who has) (attribute_name) (id as numeric|'string in quotes')
    

    for example with your table posts (and model Post) and table has attribute title:

    # regular variant:
    @special_posts = Post.find(:all)
    
    # with Spik:
    find all posts as special_posts
    

    After this you have initiated instance variable in your controller @special_posts, and you can use it in your views and later in controller

  5. Select rows from table with attribute like something:

    # regular variant:
    @table_name = TableName.find(:all, :conditions => ['attribute LIKE "%?%"', value])
    
    # with Spik:
    find all table_name with attribute_name like 'something'
    

    for example with your table posts (and model Post) and table has attribute title:

    # regular variant:
    @posts = Post.find(:all, :conditions => ['title LIKE "%?%"', 'asd'])
    
    # with Spik:
    find all posts with title like 'asd'
    

    After this you have initiated instance variable in your controller @posts with items which have title like 'asd' (asdf|qweasdf|asd|...), and you can use it in your views and later in controller

Delete

  1. Delete all rows from table with attribute equals something:

    # regular variant:
    TableName.delete_all(['attribute = ?', value])
    
    # with Spik:
    delete all table_name with attribute_name 'something'
    

    for example with your table posts (and model Post) and table has attribute title:

    # regular variant:
    Post.delete_all(['title = ?', 'asd'])
    
    # with Spik:
    delete all posts with title 'asd'
    

    After this all posts rows with title 'asd' will be deleted

  2. Delete row from table with specific id:

    # regular variant:
    TableName.delete(id)
    
    # with Spik:
    delete [first] table_name_row with id (numeric)
    

    for example with your table posts (and model Post):

    # regular variant:
    Post.delete(5)
    
    # with Spik:
    delete post with id 5
    

    After this post row with id 5 will be deleted

Usage in project

If you want to get all your posts, you just include Spik module in controller and write 'find all posts':

app/controllers/home_controller.rb

class HomeController < ApplicationController
  include Spik

  def index
    find first post
    find all posts
  end

  def search
    find all posts with title params[:post_title]
  end
end

After that you can work with variables @post and @posts:

app/views/home/index.html.erb

<h1>Hello Spik!</h1>
<%- if @posts %>
  <%= @posts.size %>
<%- end %>
<%- if @post %>
  <%= @post.title %>
<%- end %>

Installation

Puts this line into Gemfile then run $ bundle:

gem 'spik', '0.0.3'

Or if you are old-school Rails 2 developer put this into config/environment.rb and run $ rake gems:install:

config.gem 'spik', :version => '0.0.3'

Or manually install spik gem: $ gem install spik

Contributors

  • @gazay