心はいつも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

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

  関連記事

WordPressの管理画面真っ白問題に対処しました

WordPressの自作テンプレを作ったはいいものの、管理画面が真っ白になって投 …

no image
RubyとRailsのお作法

コーディングスタイルって結構気になります。 最初につとめた会社で、プログラミング …

no image
ヘルパーメソッドを自作する

便利なrailsのヘルパーメソッド。自分でも作れます。 作るときは、 アプリのd …

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

6.3.5ユーザーを作成する、です。 userモデルはできています。開発用のデー …

iPad使用前/使用後、雑感。

5/28にiPadがAppleStoreからクロネコヤマトで届けられました。 週 …

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

テストコードが長くなったからリファクタリングするかも、、といいながら、静的ページ …

Provisioning fileが作成できない!

iPhoneアプリを公開するために、itunes connectでProvisi …

no image
MacBookAirにMacAppStoreからソフトをダウンロード

MacBookAir 10日目。快調です。 WindowsからMacの移行でつま …

パーフェクトRuby 2章Rubyの基礎 2-2 変数と定数

p47 2-2-1 ローカル変数 スコープは ・ブロック内 ・メソッド定義内 ・ …

パーフェクトRuby 2章Rubyの基礎 2-8 様々な代入式

p66 2-8-1 多重代入 まとめて代入する横着なやり方。 a,b = 1,2 …