0

こんにちは私は現在、ユニットテストのチュートリアルを行っています。私は2つのモデルを持っています:SongAlbum

class Song < ActiveRecord::Base
  attr_accessible :title, :duration_in_seconds
  belongs_to :album
end

class Album < ActiveRecord::Base
  attr_accessible :artist, :title

  has_many :songs


  def duration
    songs.sum(&:duration_in_seconds)
  end

end

これは、合格することになっているテストです。

require 'test_helper'

class AlbumTest < ActiveSupport::TestCase
  test "should be able to report duration based on combined duration of its songs" do
    album = Album.create
    3.times do
      album.songs.create(:duration_in_seconds => 5)
    end
    assert_equal 15, album.duration
  end
end

アルバムモデルに見られるように、と呼ばれるメソッドがありdurationます。それについて2つの質問があります。

  1. つまり、SongはAlbumに属していることがわかります。Albumのインスタンスでメソッドを実行すると、そのメソッドでそのインスタンスの曲に直接アクセスできますか?メソッド定義がおかしいようです...@album.durationは@album.songs.sum(&:duration_in_seconds)を返しますか?Albumメソッドにこのメソッドがあったとしましょう。

def name_of_album

title

end

私が電話@album.name_of_albumした場合、それはと同じ@album.titleでしょうか?

  1. &期間メソッドのとは何ですか?と同じsongs.sum(:duration_in_seconds)ですか?
4

2 に答える 2

1

アンパサンドはRubyの一部であり、記号の前で使用すると、に変換されProcます。詳細については、 http://railscasts.com/episodes/6-shortcut-blocks-with-symbol-to-proc?view=asciicastを参照してください。

于 2012-11-30T23:22:25.993 に答える
0

最初の質問#1への回答(両方の質問に#1があります):

で定義されているすべての(パブリック)メソッドは、(によるプライベートメソッドと保護されたメソッド)Class Albumのようなそのクラスのインスタンスで使用できます。@album.your_method@album.send(:your_private_or_protected_method)

そうです、あなたの例@album.name_of_albumと同じ結果が得@album.titleられます。

私があなたの質問を正しく理解していて、それが本当にあなたの質問であるなら、Rubyを少し勉強することをお勧めします。

あなたの2番目の質問はすでに答えられていますが、とにかくこれを追加します。

songs.sum(&:duration_in_seconds)

例と同じです

songs.sum { |song| song.duration_in_seconds }
于 2012-12-01T01:56:59.313 に答える