0

嗨,我目前正在阅读有关单元测试的教程。我有两个模型: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. 我对此有两个问题。

  1. 所以我们知道 Song 属于 Album。如果我在专辑的实例上执行一个方法,我可以像那样直接在该方法中访问该实例的歌曲吗?方法定义看起来很奇怪...... @album.duration 会返回 @album.songs.sum(&:duration_in_seconds)?假设我在相册方法中有这个方法:

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。

你的第二个问题已经回答了,但我还是添加了这个。

songs.sum(&:duration_in_seconds)

与例如相同

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