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 の名前.属性、みたいな形になってますね。