Recent notes

RSS feed
August 25, 2015
0 thanks

Using Arel

You can also use Arel.

For example:

class ArticlePage < ActiveRecord::Base
  belongs_to :article
  scope :published, -> { where.not(published_at: nil) }
  scope :all_ready, -> { select("every(workflow_state = 'ready') AS is_ready") }

class Article < ActiveRecord::Base
  has_many :article_pages
  def all_ready?
    ActiveRecord::Base.select_values(article_pages.all_ready,published) = 't'
August 18, 2015
0 thanks

Add method to instacne eval

We can add method to instance by using instance_eval.

Code example

string = "String"
string.instance_eval do
  def new_method


irb(main):033:0> string.new_method
=> "gnirtS"
August 3, 2015
1 thank

define_method with default parameters

To define a method with a default parameter the usual notation can be used:

define_method("example") do |fixed, default = {}|
  # something
August 2, 2015
0 thanks

Skip validation

update_all : skip validations, and will save the object to the database regardless of its validity. They should be used with caution.

July 31, 2015
0 thanks

Also takes a block

You can define methods within a block

User = Struct.new(:first_name, :last_name) do
  def full_name
    "#{first_name} #{last_name}"

user = User.new('Simon', 'Templar') # => #<struct User first_name="Simon", last_name="Templar">
user.full_name # => "Simon Templar"
July 16, 2015
0 thanks

I would just use a validation instead of (the probably removed) :required

Just make sure you validate the presence of the association and not the foreign key, otherwise it will not work on new records.

The down side is that it will require the record in the cache, and will make a query otherwise. You can add `unless: :<foreign_key>?` If that’s a problem for you.

July 16, 2015
1 thank

Is :required still valid ?

I get this error when using :required => true

ArgumentError: Unknown key: :required. Valid keys are: :class_name, :class, :foreign_key, :validate, :autosave, :remote, :dependent, :primary_key, :inverse_of, :foreign_type, :polymorphic, :touch, :counter_cache

Is :required not a valid key anymore ?

July 13, 2015
1 thank

Correction to previous comment

You’ve misread the documentation, @sandyjoins. If you pass two arguments, the second one is a length argument, not an upper bound.

“Hello there”.byteslice(6, 1) == “t”

July 13, 2015 - (v1_9_3_392)
0 thanks

Important note!

Special cases:

Code example

Test”.byteslice(1, 3) => “est” #both limits inclusive

Test”.byteslice(0, 3) => “Tes” #upper limit exclusive

Test”.byteslice(0..3) => “Test” # Both limits inclusive

July 6, 2015
0 thanks

For supported arguments, see see match

As of July, 2015, the v4.2.1 doc says “see match[rdoc-ref:Base#match]” without a URL. I think you want this one: http://apidock.com/rails/ActionDispatch/Routing/Mapper/Base/match

July 2, 2015
0 thanks

Usage with enum

With enum fields you must use integer values:


Model.update_all(type: Model.types[specific_type])
July 1, 2015
1 thank

Space before the opening [

In this example

Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]

The array is a parameter, so a space is required before the opening [, which is equivalent to write like this

Post.find_by_sql(["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date])
June 19, 2015
1 thank

Use :where or any defined scope before :find_or_create_by

You can chain find_or_create_by with :where, or any custom scope.


User.where(girls: true).find_or_create_by(first_name: ‘Scarlett’)

scope :celebrities, -> { where(celebrity: true) }

User.celebrities.create_with(last_name: ‘Johansson’).find_or_create_by(first_name: ‘Scarlett’)

June 9, 2015 - (v1.0.0 - v4.2.1)
0 thanks

Not a one-to-one-relationship

It’s incorrect to state that belongs_to “Specifies a one-to-one association with another class”.

If the inverse association is has_one then the model specifying belongs_to is the LHS of a zero/one-to-one relationship.

If the inverse association is has_many then the model specifying belongs_to is the LHS of a zero/many-to-one relationship.

Unless you know what the inverse association is, all you can assume is that instances of a class specifying a belongs_to association can be related to at most a single instance of the other class.

June 3, 2015 - (v4.0.2 - v4.2.1)
0 thanks

render with variables

perient view

Code example

<%= render 'time_select', locals: { select_name: 'from_tiem'}%>

render view

Code example

<%= locals[:select_name] %>


Code example

<%= local_assigns[:select_name] %> 
May 23, 2015 - (v1_9_3_392)
0 thanks


Reading source one can find detailed patterns: github.com/ruby/ruby/blob/ruby_1_9_3/lib/uri/common.rb

May 22, 2015 - (>= v1_8_6_287)
0 thanks

Not exactly like map {}.flatten

To also give dimension, is about 4.5 times faster then map {}.flatten.

May 18, 2015
0 thanks

Are those supported versions correct?

It seems like this method was supported in versions prior to 4.0.2.

UPDATE never mind, wish I could delete this comment..

May 12, 2015
0 thanks

RE: Convert an Array of Arrays to a Hash using inject

Another way to convert an array of arrays to a hash using inject:

array = [['A', 'a'], ['B', 'b'], ['C', 'c']]

hash = array.inject({}) do |memo, values|
  memo.merge!(values.first => values.last)

# => {'A' => 'a', 'B' => 'b', 'C' => 'c'}
May 8, 2015 - (>= v4.0.2)
0 thanks

This doesn't write files

This doesn’t write files, at least not anymore. Since at least rails 4 `Rack::Cache` isn’t included by default. In any case this method only ever set headers on the response.

May 1, 2015
6 thanks

Very bad documentation

This is terrible documentation. It makes it very hard to understand what the arguments mean.

The signature is

alias_method(p1, p2)

So what do p1 and p2 mean? The description doesn’t refer to them at all, but to new_name and old_name. How are we supposed to know which is which?

And then it gets even worse in the code sample:

alias_method :orig_exit, :exit

From the naming it sounds like the first argument is the original method name.

Documentation is supposed to resolve this kind of confusion, not create it.

April 29, 2015
0 thanks

Prevent new line character.

To prevent the “\n” character added at the end of each file pass in the “row_sep: nil” option:

[ "some", "array" ].to_csv                 # => "some, array\n"  

[ "some", "array" ].to_csv( row_sep: nil ) # => "some, array"
April 23, 2015
0 thanks

add index directly

You can add an index now directly on the foreign_key :

t.references(:user, index: true)
April 21, 2015
0 thanks

RSS feeds in Rails

Fetching RSS feeds in the request/response cycle inside a Rails application is probably not the very best approach, as it will make your application as slow as the server serving RSS feeds. Another option is to do it asynchronously using a worker or a queue, but this can also become quite complex and hard to maintain over time.

Another solution is to use an API like superfeedr.com and its Rails Engine (http://blog.superfeedr.com/consuming-rss-feeds-rails/). All the polling and parsing is done on Superfeedr’s side and your application is notified in realtime as soon as the resources are updated using a webhook pattern.

April 14, 2015
0 thanks


It still exists but you give it a block instead of creating a method:


def before_create
  self.login = self.first_name


before_create :set_login

def set_login
  self.login = self.first_name
April 8, 2015 - (v3.1.0 - v4.1.8)
1 thank

What object_name.method values will result in checked chekboxes.

*It’s intended that method returns an integer and if that integer is above zero, then the checkbox is checked.* - more exactly, that’s how it’s determined whether value will be checked or not:

(`@checked_value` is checked_value, `value` is what object_name.method returns)

def checked?(value)
  case value
  when TrueClass, FalseClass 
    value == !!@checked_value
  when NilClass
  when String
    value == @checked_value
    if value.respond_to?(:include?)
      value.to_i == @checked_value.to_i
April 2, 2015
0 thanks


“Acceptable exception types maye be given as optional arguments. If the last argument is a String, it will be used as the error message.”


“Acceptable exception types may be given as optional arguments. If the last argument is a String, it will be used as the error message.”

April 1, 2015 - (>= v4.1.8)
0 thanks

Parent associations are kept

Maybe this information will save you some time: parent associations (i.e. associations with foreign id in current record) are copied. Don’t assume you’ll get a safely editable object.