2013-11-19 3 views
0

Я хочу, чтобы реорганизовать это:Как реорганизовать методы экземпляра с использованием динамических методов в Ruby?

class Collection 
    def artists 
    @songs.map { |song| song.artist }.uniq 
    end 
    def albums 
    @songs.map { |song| song.album }.uniq 
    end 
    def names 
    @songs.map { |song| song.name }.uniq 
    end 
end 

во что-то вроде этого:

class Collection 
    song_attributes = [:artist, :album, :name] 
    song_attributes.each do |song_attribute| 
    define_method song_attribute do 
     @songs.map { |song| song.public_send(song_attribute) }.uniq 
    end 
    end 
end 

Проблемы заключается в линии define_method song_attribute do где song_attribute должны быть множественной. Как мне это сделать?

я придумал только с этим, но я полагаю, что есть лучший способ:

song_attributes = [[:artists, :artist], [:albums, :album], [:names, :name]] 
song_attributes.each do |song_attribute| 
    define_method song_attribute[0] do 
    @songs.map { |song| song.public_send(song_attribute[1]) }.uniq 
    end 
end 

ответ

2

Передать строку в define_method

..... 
song_attributes = [:artist, :album, :name] 

song_attributes.each do |song_attribute| 
    define_method("#{song_attribute}s") do 
    @songs.map { |song| song.public_send(song_attribute) }.uniq 
    end 
end 
..... 
Смежные вопросы