心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

RailsTutorial4.0を高速で復習する。11章。

   


第11章ユーザーをフォローする、です。ようやく最終章。1週間でできるつもりが3週間かかってしまいました。まだまだです。がんばろう。

ブランチ作成します。
git checkout -b following-users

11.1Relationshipモデル、です。

ユーザーのフォローを実装するのですが、フォローは1:nではなくm:nの関係です。

11.1.1データモデルの問題 (および解決策)、です。

データモデルの検討

user_has_many_followed_users

ユーザのフォロー、フォロワー関係を示すRelationshipモデルを作成し、ユーザー情報とマッピングします。

Relationshipモデルの作成

rails g model Relationship follower_id:integer followed_id:integer
rm -f spec/factories/relationship.rb

リスト11.1 relationshipsテーブルにインデックスを追加する。
db/migrate/[timestamp]_create_relationships.rb

class CreateRelationships < ActiveRecord::Migration
  def change
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :followed_id

      t.timestamps
    end
    add_index :relationships, :follower_id
    add_index :relationships, :followed_id
    add_index :relationships, [:follower_id, :followed_id], unique: true
  end
end
bundle exec rake db:migrate
bundle exec rake test:prepare

テストを書く

先に
11.1.2User/relationshipの関連付け、です。テストを書きます。

リスト11.2 リレーションシップの作成と属性をテストする。
spec/models/relationship_spec.rb

require 'spec_helper'

describe Relationship do

  let(:follower) { FactoryGirl.create(:user) }
  let(:followed) { FactoryGirl.create(:user) }
  let(:relationship) { follower.relationships.build(followed_id: followed.id) }

  subject { relationship }

  it { should be_valid }
end

UserモデルやMicropostモデルのテストのときは、それぞれ@userや@micropostを使用していました。この違いが問題になることはほとんどありませんが、動作をよりはっきりとさせるために、インスタンス変数を使用する際にはletを使用することをお勧めします。

リスト11.3 user.relationships属性のテスト。
spec/models/user_spec.rb

require 'spec_helper'

describe User do
略
  it { should respond_to(:feed) }
  it { should respond_to(:relationships) }
略
end

リスト11.5 ユーザー/リレーションシップのbelongs_to関連付けをテストする。
spec/models/relationship_spec.rb

describe Relationship do
略
  describe "follower methods" do
    it { should respond_to(:follower) }
    it { should respond_to(:followed) }
    its(:follower) { should eq follower }
    its(:followed) { should eq followed }
  end
end

実装する

リスト11.4 ユーザー/リレーションシップのhas_manyの関連付けを実装する。
app/models/user.rb

class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
略
end

リスト11.6 belongs_to関連付けを Relationshipモデルに追加する。
app/models/relationship.rb

class Relationship < ActiveRecord::Base
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
end

11.1.3検証、です。

relationshipのテストを書く

リスト11.7 Relationshipモデル検証のテスト。
spec/models/relationship_spec.rb

describe Relationship do
略
  describe "when followed id is not present" do
    before { relationship.followed_id = nil }
    it { should_not be_valid }
  end

  describe "when follower id is not present" do
    before { relationship.follower_id = nil }
    it { should_not be_valid }
  end
end

実装する

リスト11.8 Relationshipモデルの検証を追加する。
app/models/relationship.rb

class Relationship < ActiveRecord::Base
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
  validates :follower_id, presence: true
  validates :followed_id, presence: true
end

テストはパスします。いったんコミットし、次は
11.1.4フォローしているユーザー
です。

 - テクニカル ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

パーフェクトRuby 2章Rubyの基礎 2-1 Hello,Ruby

12章から5章まではPart2 Ruby言語仕様 です。 2章 Rubyの基礎 …

no image
Macでアプリを強制終了

Macでアプリを強制終了したことは今までなかったのですが、どうにもftpソフトの …

no image
railsのエラーメッセージを日本語化

message:で渡すエラーメッセージや、その他いろんな箇所を日本語化します。 …

no image
RailsTutorial4.0を高速で復習する。10.3章。

10.3マイクロポストを操作する、です。 仕様の理解 ポストはユーザーだけが投稿 …

no image
ブログのデザイン開発、着手から完成まで今日1日でやります

久々のブログです。 昨日アクセス解析も1年ぶりに見たのですが、何がなくとも一定の …

no image
MacBookAirで真央ちゃんのテレビ放映を見ました

テレビ持っていないを公言しています。 15年以上使っていたナショナル6型ブラウン …

twitterと連携した写真のライブラリー

iPhoneを使うようになってから気軽に写真撮影し、そのままtwitter投稿す …

no image
データベースのリファクタリング?

ruby on rails3プリケーションプログラミングの本の内容をruby2. …

no image
RailsTutorial4.0を高速で復習する。3.5章。最後の問題。

3.5演習、3もんめ、最後の問題です。 3.(上級者向け)「Heroku pag …

no image
RailsTutorial4.0を高速で復習する。9.2章。

9.2認可、です。 自分以外の人が自分のProfileを変更できないようにします …