2017-10-31 2 views
0

私は、オブジェクトリレーションを含むプロジェクトと、関連付けによって相互に作用するクラスを構築しています。Ruby:オブジェクトの関係

具体的には、.find_or_create_by_nameメソッドに問題があります。このメソッドは、アーティストを名前で検索または作成し、名前プロパティでオブジェクトの一意性を維持します。これは機能します。 次の部分は、存在しない場合、アーティストの新しいインスタンスを作成する必要があります。これは機能しません。

class Artist 
    attr_accessor :name, :song 
    @@all = [] 

    def initialize(name) 
    @name = name 
    @songs = [] 
    end 

    def self.name= 
    @name 
    end 

    def add_song(song) 
    @songs << song 
    end 

    def songs 
    @songs 
    end 

    def self.all 
    @@all 
    end 

    def save 
    self.class.all << self 
    end 

    def self.new_by_name(name) 
    artist_name = Song.new(name) 
    artist_name 
    end 

    def self.create_by_name(name = nil) 
    artist = self.new_by_name(name) 
    artist.save 
    artist 
    end 

    def self.find_by_name(name = nil) 
    @@all.detect{|x| x.name == name} 
    end 

    def self.find_or_create_by_name(name) 
    if find_by_name(name) == nil 
     create_by_name(name) 
    else 
     find_by_name(name) 
    end 
    end 

end 
+0

。 @all || = [];終わり。 – Kris

+0

また、 'def self.name'はクラスメソッドです。私はそれを削除する必要があると思います。 – Kris

+0

'find_or_create_by_name'を' find_by_name(name) 'に単純化することもできます。 create_by_name(name) 'です。 – Kris

答えて

0

私は戻ってきて、.new_by_nameメソッドがアーティストの代わりに新しいソングを作成していたことに気付きました。私はその行をartist_name = Artist.new(name)に変更しましたが、エラーは表示されなくなりました。ここで

は、あなたたちが言及した変更でコード(!ありがとう)の残りの部分である:代わりに `@@ ALL`多分デフself.all`使用の

class Artist 
    attr_accessor :name, :song 
    @@all = [] 

    def initialize(name) 
    @name = name 
    @songs = [] 
    end 


    def add_song(song) 
    @songs << song 
    end 

    def songs 
    @songs 
    end 

    def self.all 
    @@all 
    end 

    def save 
    self.class.all << self 
    end 

    def self.new_by_name(name) 
    artist_name = Artist.new(name) 
    artist_name 
    end 

    def self.create_by_name(name) 
    artist = self.new_by_name(name) 
    artist.save 
    artist 
    end 

    def self.find_by_name(name) 
    @@all.detect{|x| x.name == name} 
    end 

    def self.find_or_create_by_name(name) 
    if self.find_by_name(name) == nil 
     self.create_by_name(name) 
    else 
     self.find_by_name(name) 
    end 
    end 

end 
関連する問題