まぁ、ログ見りゃいいんだけど。デバッグで止めてちょっとずつ条件変えながらSQL見たい時とかデフォルトスコープを確認したいけどモデル見るの面倒な時とか。
環境は引き続き
ruby 1.9.2
rails 3.0.5
まず、ActiveRecordにto _sqlってのがあります。
これ使うとSQL文を確認できる。
ちなみにモデルにはact _as _paranoid使ってdestroyは全て論理削除状態。
デフォルトのスコープでdeleted _at is nullの条件がつく状態。
1
|
User.where("created_at > ?",Date.yesterday).to_sql # => "SELECT `users`.* FROM `users` WHERE (users.deleted_at IS NULL) AND (created_at > '2012-03-08')"
|
whereの後に使えば、とりあえずは使えるみたい。
んでuserクラスにimagesがhas _manyで宣言されている場合。
1
2
|
user = User.find(1)
user.images.to_sql #=> NoMethodError: undefined method `to_sql'
|
whereを付ければto _sql使えたのでwhereつける。
1
|
user.images.where("").to_sql #=> "SELECT `user_images`.* FROM `user_images` WHERE (user_images.deleted_at IS NULL) AND (`user_images`.user_id = 1) ORDER BY position ASC, `sequence` ASC"
|
とれた。
なんかよくわからん。
環境は引き続き
ruby 1.9.2
rails 3.0.5
まずはradio _button _tag
1
2
|
<%= radio_button_tag :foo,1,true %>
<%= radio_button_tag :foo,0,false %>
|
checkedのon offは第3引数にbooleanを渡す。
第3引数はデフォルトでfalse
んで、radio _button
1
2
3
4
|
<%= f.radio_button :web_nomination_system_disp, 1, :checked => true %>
<%= f.radio_button :web_nomination_system_disp, 1, :checked => nil %>
<%= f.radio_button :web_nomination_system_disp, 1, :checked => "" %>
<%= f.radio_button :web_nomination_system_disp, 1, :checked => false %>
|
radio _buttonは非チェックはnilと"“とfalseでもいけた。
詳しくはこれ以上調べない!(`・∀・´)
間違っていたので一部修正しました。
すいません
こんな風にかける。
1
2
3
4
5
6
|
foo = nil
foo = foo || if (rand(2) + 1).odd?
"foo"
else
"fooooooooooooo"
end
|
すごい。
そんなあなたに。
ruby 1.9.2
rails 3.0.5
で確認しました。
ここを参考にしました。
1
2
3
4
5
6
7
|
before_filter :display_list, :only => ['top'] do |controller|
controller.display_list('index')
end
def display_list(list)
p list #=> 'index'
end
|
ちなみにこれでも動きました。でもなんかこの書き方怖い。
1
|
before_filter "display_list('index')".to_sym
|
前に書いた
オープンクラスでは、クラスを再オープンしてメソッドを追加した場合に。
同じクラスから生成されたオブジェクト全てにメソッドが追加されました。
もう一回やってみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class Hoge
def aaa
p 'aaa'
end
end
hoge1 = Hoge.new
hoge2 = Hoge.new
hoge1.methods.grep(/aaa|bbb/) # => [:aaa]
hoge2.methods.grep(/aaa|bbb/) # => [:aaa]
class Hoge
def bbb
p 'bbb'
end
end
hoge1.methods.grep(/aaa|bbb/) # => [:aaa, :bbb]
hoge2.methods.grep(/aaa|bbb/) # => [:aaa, :bbb]
|
生成されたオブジェクトがメソッドを呼ぶとき。
オブジェクトはクラスにメソッドを探しにいき、クラスに定義したメソッドがあった場合にそれを実行します。
つまりクラスのメソッドに対する変更はそのクラスから生成された全オブジェクトに影響があるということです。
でも実際には特定のオブジェクトにのみ処理を追加したい場合があります。
特異なんとかを使います。
ruby1.9からです。
1
2
3
4
5
6
7
8
9
10
11
|
class Foo
def initialize
@v = 2
end
end
foo = Foo.new
foo.instance_exec(2) do |bar|
p @v * bar
end
# => 4
|
1
2
|
ActiveRecord::Base.connection.execute("drop table foo")
Model.connection..execute("drop table foo")
|
テーブルの一覧を取得
1
|
ActiveRecord::Base.connection.tables
|
rubyにはスコープゲートがある。
スコープゲートを越えて変数は参照できない。
スコープゲートには
class
module
def
があり、それぞれのブロックの中ではスコープが切り替わる。
1
2
3
4
5
6
7
8
9
10
|
class Foo
str = "foo"
def print
str
end
end
foo = Foo.new
foo.print # => NameError: undefined local variable or method `str'が発生する
|
def printでスコープが変わるので、外側のstrが参照できない。
解決するには例えばフラットスコープ
1
2
3
4
5
6
7
8
9
10
|
class Bar
str = "bar"
define_method :print do
str
end
end
bar = Bar.new
bar.print
|
スコープゲート(class/module/def)を使わなければいいという話。
今回はdefをdefine _methodに変更した
動的ディスパッチ
メソッド実行時にメソッドを動的に呼び出す。
日づけごとに天気を返すメソッドがあって、それを動的ディスパッチでメソッドを呼んでみます。
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
|
class Weather
def weather_of_day(day)
send("weather_of_day_#{day}")
end
def weather_of_day_1
"快晴"
end
def weather_of_day_2
"多分雪"
end
def weather_of_day_3
"ほどよく寒い曇り空"
end
def weather_of_day_4
"寒いよ。雨"
end
def weather_of_day_5
"晴れ時々曇り"
end
def method_missing(method_id,*args)
return "#{$1}日は指定できません" if method_id =~ /^weather_of_day_(.*)/
super
end
end
Weather.new.weather_of_day(1) #=> "快晴"
Weather.new.weather_of_day(3) #=> "ほどよく寒い曇り空"
|
動的メソッド
動的にメソッドを作成する