File: finders.rb

package info (click to toggle)
ruby-friendly-id 5.6.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 436 kB
  • sloc: ruby: 3,248; makefile: 3
file content (90 lines) | stat: -rw-r--r-- 2,440 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
require File.expand_path("../../helper", __FILE__)
require "ffaker"

# This benchmark tests ActiveRecord and FriendlyId methods for performing a find
#
# ActiveRecord: where.first                     8.970000   0.040000   9.010000 (  9.029544)
# ActiveRecord: where.take                      8.100000   0.030000   8.130000 (  8.157024)
# ActiveRecord: find                            2.720000   0.010000   2.730000 (  2.733527)
# ActiveRecord: find_by(:id)                    2.920000   0.000000   2.920000 (  2.926318)
# ActiveRecord: find_by(:slug)                  2.650000   0.020000   2.670000 (  2.662677)
# FriendlyId: find (in-table slug w/ finders)   9.820000   0.030000   9.850000 (  9.873358)
# FriendlyId: friendly.find (in-table slug)    12.890000   0.050000  12.940000 ( 12.951156)

N = 50000

def transaction
  ActiveRecord::Base.transaction do
    yield

    raise ActiveRecord::Rollback
  end
end

class Array
  def rand
    self[Kernel.rand(length)]
  end
end

Book = Class.new ActiveRecord::Base

class Journalist < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: :slugged
end

class Manual < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: :history
end

class Restaurant < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: :finders
end

BOOKS = []
JOURNALISTS = []
MANUALS = []
RESTAURANTS = []

100.times do
  name = FFaker::Name.name
  BOOKS << (Book.create! name: name).id
  JOURNALISTS << (Journalist.create! name: name).friendly_id
  MANUALS << (Manual.create! name: name).friendly_id
  RESTAURANTS << (Restaurant.create! name: name).friendly_id
end

ActiveRecord::Base.connection.execute "UPDATE manuals SET slug = NULL"

Benchmark.bmbm do |x|
  x.report "ActiveRecord: where.first" do
    N.times { Book.where(id: BOOKS.rand).first }
  end

  x.report "ActiveRecord: where.take" do
    N.times { Book.where(id: BOOKS.rand).take }
  end

  x.report "ActiveRecord: find" do
    N.times { Book.find BOOKS.rand }
  end

  x.report "ActiveRecord: find_by(:id)" do
    N.times { Book.find_by(id: BOOKS.rand) }
  end

  x.report "ActiveRecord: find_by(:slug)" do
    N.times { Restaurant.find_by(slug: RESTAURANTS.rand) }
  end

  x.report "FriendlyId: find (in-table slug w/ finders)" do
    N.times { Restaurant.find RESTAURANTS.rand }
  end

  x.report "FriendlyId: friendly.find (in-table slug)" do
    N.times { Restaurant.friendly.find RESTAURANTS.rand }
  end
end