Ruby on Rails Tutorial (17)
朝練メモ。
10.1.4 Micropost refinements
ordering および dependency を追加とのこと。まず、spec/factories.rb を修正とのこと。以下を追加。
factory :micropost do content "Lorem ipsum" user end
これで関連がつくんですね。以下で云々、らしい。
FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago)
ええと、読み込み順を user_id + created_at の降順 (?) にしたいですね。そのために試験を user な試験に追加しています。
describe "micropost associations" do before { @user.save } let!(:older_micropost) do FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago) end let!(:newer_micropost) do FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago) end it "should have the right microposts in the right order" do @user.microposts.should == [newer_micropost, older_micropost] end end
let! については別途確認のこと。
つうか凄い確認方法ですね。順番確認でこんな書き方できるとは。
で、micropost な model に以下を追加。
default_scope order: 'microposts.created_at DESC' end
default_scope ですか。試験も green 終了確認。
次は destroy な問題な模様。user が削除されたら microposts はどうなるのか、なソレ。削除確認な試験を云々、なんスかね。以下なコードが例示されてますが
microposts = @user.microposts @user.destroy microposts.each do |micropost| # Make sure the micropost doesn't appear in the database. end
@user.microposts が戻すのはその時点で @user が保持している microposts を配列にして戻しているので、次の @user.destroy で配列オブジェクトの面倒までは見ないですよ、というあたりの記述がありますね。あるいは代入によるコピィ (これは参照をコピィしているのみ、な模様)
>> b = a => [1, 2, 3]
と dup によるコピィの違いも例示されていますね。
>> b = a.dup => [1, 2, 3]
あ、なるほど dup でコピィを持っておいてその id があるかどうかを確認してるのか。
it "should destroy associated microposts" do microposts = @user.microposts.dup @user.destroy microposts.should_not be_empty microposts.each do |micropost| Micropost.find_by_id(micropost.id).should be_nil end end end
Micropost.find(micropost.id) は例外吐くんですね。逆に find_by_id は nil を戻すそうな。むむむむ的。
で、最後に user.rb の has_many の部分を以下に、とのこと。あ、一応試験 green を盛り込み前に確認済みです。
class User < ActiveRecord::Base attr_accessible :name, :email, :password, :password_confirmation, :admin has_secure_password has_many :microposts, dependent: :destroy
10.1.5 Content validations
validation な試験を追加とのこと。
describe "when user_id is not present" do before { @micropost.user_id = nil } it { should_not be_valid } end describe "with blank content" do before { @micropost.content = " " } it { should_not be_valid } end describe "with content that is too long" do before { @micropost.content = "a" * 141 } it { should_not be_valid } end
盛り込んで試験 red 確認。追加は一行とのこと。
validates :content, presence: true, length: { maximum: 140 }
presence が true で上の試験が両方通るのか。ここも別途確認必要ですね。盛り込んだ後に試験 green 終了確認済みです。
10.2 Showing microposts
つうか中身確認してる内に時間切れになりそうですね。メモがあれば追記の方向です。あと、要確認ってメモ入れてるソレを確認すれば同様に追記の方向。
追記
以下を云々。
- sidekiq
- let! について
- default_scope について
sidekiq
Gitlab 4.1 で resque から sidekiq に変更に、とのこと。
以下によれば
プロセス、とスレッド、の違いということらしい。早いのでこちらを採用したのかどうか。あと redis は job queue の管理に使っているとの記述もありますね。
別途 Gitlab 4.1 なソレを sidekiq マターで掘削してみます。
let! について
let は lazy eval とのこと。参照時に、てのは都合が悪いですね。
default_scope について
こちらもちょい微妙。今回の実装例ではソートの条件を指定してますね。
default_scope order: 'microposts.created_at DESC'
上の例では model の名前.属性、みたいな形になってますね。