2016-07-15 19 views
1

ビューのネストされたループと同様に、配列の配列をプルするメソッドを作成しようとしています。railsネストされた属性を持つ複数のルビ配列

私はこれを行う私のUserモデルのメソッドを構築しようとしています

@past_parties = User.parties 

<%= @past_parties.each do |past_party| %> 
    <%= past_party.guests("email").uniq.each do |guest| %> 
    <%= guest.name %> <%= guest.email %> 
    <% end %> 
<% end %> 

これらは私のモデルです:

class User < ActiveRecord::Base 

    has_many :hosts, dependent: :destroy 
    has_many :parties, through: :hosts 

    def past_guests 
    self.parties.guests 
    end 
end 

class Host < ActiveRecord::Base 
    belongs_to :user 
    has_many :parties, dependent: :destroy 
    has_many :guests, through: :parties 

end 

class Party < ActiveRecord::Base 

    belongs_to :host 
    has_many :guests, dependent: :destroy 

end 

class Guest < ActiveRecord::Base 

    belongs_to :party 

end 

私はループがビューで仕事を得ることができますが、メソッドとしてビルドしようとすると(current_userがUserのインスタンスである場合、current_user.past_guestsを呼び出すことができます)、このエラーが発生します。

undefined method `guests' for #<ActiveRecord::Associations::CollectionProxy []> 

ビューにループを作成せずに、招待したすべてのゲストを取得するにはどうすればよいですか?

+0

、クラスメソッドにメソッドを変更します。 – power

+0

ああ、私は間違って書いた...私はcurrent_user.past_guests、User.past_guestsは言うつもりだった。私はそれを修正しました。 – NothingToSeeHere

答えて

1

問題は、あなたが別のarrayからarrayにアクセスしようとしているということです:あなたがしたいので、もし

self.parties.guests 

self.partiesは、#<ActiveRecord::Associations::CollectionProxy []>を返します。 partiesguestsを取得する必要があります。

しかし、あなたは唯一のゲストをしたいので、あなたは単にあなたのユーザークラスに変更することができます:あなたはUserクラスのインスタンスメソッドのpast_guestsを呼び出している

class User < ActiveRecord::Base 

    has_many :hosts, dependent: :destroy 
    has_many :parties, through: :hosts 
    has_many :guests, through: :parties 

    # Call your guests 
    def past_guests 
    self.guests 
    end 
end 
0

各パーティはゲストのコレクションを持っています。あなたのメソッド定義でこれを実行する必要があります。

def past_guests 
    self.parties.collect(&:guests) 
end 
関連する問題