3. RUBY
+ berljivost
+ površinska enostavnost
+ polno objektni jezik
+ funkcijsko programiranje
+ metaprogramiranje
+ ekosistem
+ RubyGems
- metaprogramiranje
- hitrost vs. Scala, Java, C
- znanost (SciPy)
Thursday, October 10, 13
4. (0..10).each do |x|
puts "The number is: #{x}"
end
<?php
for ($x=0; $x<=10; $x++)
{
echo "The number is: $x";
}
?>
for x in range(0, 11):
print 'The number is:
%d' % (x)
Ruby PHP Python
Thursday, October 10, 13
5. (0..10).each do |x|
puts "The number is: #{x}"
end
<?php
for ($x=0; $x<=10; $x++)
{
echo "The number is: $x";
}
?>
for x in range(0, 11):
print 'The number is:
%d' % (x)
Ruby PHP Python
for x in 0..10
puts 'The number is: %d' % [x]
end
Thursday, October 10, 13
6. (0..10).each do |x|
puts "The number is: #{x}"
end
<?php
for ($x=0; $x<=10; $x++)
{
echo "The number is: $x";
}
?>
for x in range(0, 11):
print 'The number is:
%d' % (x)
Ruby PHP Python
for x in 0..10
puts 'The number is: %d' % [x]
end
0.upto(10).each { |x|
printf('The number is: %d', x)
}
Thursday, October 10, 13
7. (0..10).each do |x|
puts "The number is: #{x}"
end
<?php
for ($x=0; $x<=10; $x++)
{
echo "The number is: $x";
}
?>
for x in range(0, 11):
print 'The number is:
%d' % (x)
Ruby PHP Python
for x in 0..10
puts 'The number is: %d' % [x]
end
0.upto(10).each { |x|
printf('The number is: %d', x)
}
11.times do |x|
puts "The number is: #{x}"
end
Thursday, October 10, 13
8. (0..10).each do |x|
puts "The number is: #{x}"
end
<?php
for ($x=0; $x<=10; $x++)
{
echo "The number is: $x";
}
?>
for x in range(0, 11):
print 'The number is:
%d' % (x)
Ruby PHP Python
for x in 0..10
puts 'The number is: %d' % [x]
end
0.upto(10).each { |x|
printf('The number is: %d', x)
}
11.times do |x|
puts "The number is: #{x}"
end
puts (0..10).map{|x| "The number is: #{x}"}
Thursday, October 10, 13
9. (0..10).each do |x|
puts "The number is: #{x}"
end
<?php
for ($x=0; $x<=10; $x++)
{
echo "The number is: $x";
}
?>
for x in range(0, 11):
print 'The number is:
%d' % (x)
Ruby PHP Python
for x in 0..10
puts 'The number is: %d' % [x]
end
0.upto(10).each { |x|
printf('The number is: %d', x)
}
11.times do |x|
puts "The number is: #{x}"
end
puts (0..10).map{|x| "The number is: #{x}"}
puts ("The number is Nn" * 11).gsub('N').with_index{|_,i| i}
Thursday, October 10, 13
13. class Bar
def hello
puts 1
end
end
Bar.new.hello
Bar.ancestors
๏ BasicObject
๏ Kernel
๏ Object
๏ Bar
Thursday, October 10, 13
14. class Foo
def hello
puts 'hello'
end
end
class Bar < Foo
def hello
puts 1
super
end
end
Bar.new.hello
Bar.ancestors
๏ BasicObject
๏ Kernel
๏ Object
๏ Foo
๏ Bar
Thursday, October 10, 13
15. module FooBar
def hello
puts 2
super
end
end
class Foo
def hello
puts 'hello'
end
end
class Bar < Foo
include FooBar
def hello
puts 1
super
end
end
Bar.new.hello
Bar.ancestors
๏ BasicObject
๏ Kernel
๏ Object
๏ Foo
๏ FooBar
๏ Bar
Thursday, October 10, 13
16. module FooBar
def hello
puts 2
super
end
end
class Foo
def hello
puts 'hello'
end
end
class Bar < Foo
include FooBar
def hello
puts 1
super
end
end
Bar.new.hello
Bar.ancestors
๏ BasicObject
๏ Kernel
๏ Object
๏ Foo
๏ FooBar
๏ Bar
1
2
hello
Thursday, October 10, 13
17. module FooBar
def hello
puts 2
super
end
end
class Foo
def hello
puts 'hello'
end
end
class Bar < Foo
prepend FooBar
def hello
puts 1
super
end
end
Bar.new.hello
Bar.ancestors
๏ BasicObject
๏ Kernel
๏ Object
๏ Foo
๏ Bar
๏ FooBar
Thursday, October 10, 13
18. module FooBar
def hello
puts 2
super
end
end
class Foo
def hello
puts 'hello'
end
end
class Bar < Foo
prepend FooBar
def hello
puts 1
super
end
end
Bar.new.hello
Bar.ancestors
๏ BasicObject
๏ Kernel
๏ Object
๏ Foo
๏ Bar
๏ FooBar
2
1
hello
Thursday, October 10, 13
26. RUBY 2.1: REFINEMENTS
module BalkanString
refine String do
def debalkanize
ActiveSupport::Inflector.transliterate(self)
end
end
end
class User < ActiveRecord::Base
using BalkanString
def name
@name.debalkanize if @name
end
end
"test".debalkanize # NoMethodError
Thursday, October 10, 13
42. TURBOLINKS
Video (57:10)
Rails Conf 2013 Patterns of Basecamp's Application
Architecture by David Heinemeier Hansson
http://www.youtube.com/watch?v=yhseQP52yIY
Thursday, October 10, 13
47. POSTGRESQL ARRAY
class CreateDocuments < ActiveRecord::Migration
def change
create_table :documents do |t|
t.string :title
t.string :tags, array: true, default: []
t.timestamps
end
end
end
Thursday, October 10, 13
50. POSTGRESQL HSTORE
class AddHstoreExtension < ActiveRecord::Migration
def up
execute 'CREATE EXTENSION hstore'
end
def down
execute 'DROP EXTENSION hstore'
end
end
class AddPropertiesToComics < ActiveRecord::Migration
def change
add_column :comics, :properties, :hstore
end
end
Thursday, October 10, 13
51. POSTGRESQL HSTORE
class Comic < ActiveRecord::Base
end
Comic.create(properties: { issued: 1.year.ago })
Comic.where("properties -> 'issued' > ?", 2.years.ago)
Thursday, October 10, 13
52. POSTGRESQL HSTORE
class Comic < ActiveRecord::Base
store_accessor :properties, :issued
end
Comic.create(issued: 1.year.ago)
Comic.where("properties -> 'issued' > ?", 2.years.ago)
Ali sploh rabiš hstore v tem primeru?
Thursday, October 10, 13
54. SCOPES
class User < ActiveRecord::Base
# Rails 3
scope :newest, where("created_at > ?", 1.week.ago)
# Rails 4
scope :newest, -> { where("created_at > ?", 1.week.ago) }
end
Thursday, October 10, 13
55. WHERE.NOT
# Rails 3
User.where('role != ?', 'admin')
User.where('nickname IS NOT NULL')
# Rails 4
User.where.not(role: 'admin')
User.where.not(nickname: nil)
Thursday, October 10, 13
56. MIGRACIJE PREJ
class ChangeProductsPrice < ActiveRecord::Migration
def up
change_table :products do |t|
t.change :price, :string
end
end
def down
change_table :products do |t|
t.change :price, :integer
end
end
end
Thursday, October 10, 13
57. MIGRACIJE
class ChangeProductsPrice < ActiveRecord::Migration
def change
reversible do |dir|
change_table :products do |t|
dir.up { t.change :price, :string }
dir.down { t.change :price, :integer }
end
end
end
end
Thursday, October 10, 13
58. NONE RELATION
class User < ActiveRecord::Base
scope :with_role, ->(role) {
if User.role_valid? role
where(role: role)
else
none
end
}
end
User.with_role(params[:role]).where.not(nick: nil)
Thursday, October 10, 13
61. RAILS 3
class User < ActiveRecord::Base
attr_accessible :name
end
# controller
user.update_attributes(params[:user])
# admin
user.update_attributes(is_admin: true) # :-(
user.is_admin = true
user.save
Thursday, October 10, 13
62. RAILS 3
class User < ActiveRecord::Base
attr_accessible :name
end
# controller
user.update_attributes(params[:user])
v čem je v resnici problem?
Thursday, October 10, 13
63. RAILS 3
class User < ActiveRecord::Base
attr_accessible :name
end
# controller
user.update_attributes(params[:user])
user.update_attributes(is_admin: true) # :-(
non-sanitized
user input
Thursday, October 10, 13
64. STRONG PARAMETERS
class User < ActiveRecord::Base
end
# controller
def user_params
params.require(:user).permit(:name)
end
user.update_attributes(user_params)
user.update_attributes(params[:user])
# error: Unpermitted parameters
user.update_attributes(is_admin: true) # OK :-)
Thursday, October 10, 13
65. CACHING
• avtomatski expire pri spremembi modela
• avtomatski expire pri spremembi viewa
• russian doll (nested) caching
• Rails Conf 2013 Patterns of Basecamp's Application
Architecture by David Heinemeier Hansson
• http://www.youtube.com/watch?v=yhseQP52yIY
Thursday, October 10, 13
66. ACTIVESUPPORT::CONCERN
module Commentable
extend ActiveSupport::Concern
included do
has_many :comments
end
def has_comments?
!comments.empty?
end
module ClassMethods
def comments_count
joins(:comments)
.references(:comments)
.pluck("COUNT(comments.id)")
end
end
end
class Post < ActiveRecord::Base
include Commentable
end
User.posts.comment_count
Post.first.comments
Post.first.has_comments?
Rails 4 ima direktorij za concerne.
Whatever.
Thursday, October 10, 13