2

基本的に ROR ガイドhttp://guides.rubyonrails.org/association_basics.html#the-has_many-through-associationに従って、以下に示すような関係モデルを作成しました。

スルー アソシエーションにより、@user.trips は、ユーザーが作成した旅行とユーザーに属する旅行の両方を提供すると考えました。ただし、@user.trips.countコンソールで行うと、結果はユーザーが作成した旅行の数だけでした。「グループ」関連付けを通じてユーザーに属する旅行はカウントされませんでした。

質問: ユーザーが作成した旅行と、ユーザーが「グループ」を通じて所属する旅行の両方をビューに表示するにはどうすればよいですか?

ユーザー/show.html.erb

<% unless @user.all_trips.empty? %>
  <% @user.all_trips.each do |trip| %>
     <!-- Content -->
  <% end %>
<% end %>

user.rb

class User < ActiveRecord::Base
  has_many :group_trips, :through => :groups,
                         :source   => :trip
  has_many :trips, :dependent => :destroy
  has_many :groups

  def all_trips
    self.trips | self.group_trips
  end


end

trip.rb

class Trip < ActiveRecord::Base
  belongs_to :user
  belongs_to :traveldeal
  has_many :groups

  has_many :users, :through => :groups
end

group.rb

class Group < ActiveRecord::Base
  belongs_to :trip
  belongs_to :user
end

ありがとう!

編集: TSherif の部分的なソリューションごとにコードを修正しました。編集 2: all_trips メソッドを修正しました。この時点で、すべてがうまくいくようです。

4

1 に答える 1

2

おー!私はあなたがやろうとしていることと、なぜそれが問題なのかを理解していると思います。なぜが2 回has_many :trips呼び出されたのか疑問に思っていました。しかし、私が理解していることから、あなたには 2 つの異なる関係があります。これら 2 つに同じ名前を付けることはできません。そうしないと、一方が他方を隠してしまいます。次のようなことを試してください: UserTrip

class User < ActiveRecord::Base
  has_many :group_trips, :through => :groups,
                         :class_name   => "Trip"
  has_many :trips, :dependent => :destroy
  has_many :groups

  def all_trips
    Trip.joins(:groups).where({:user_id => self.id} | {:groups => {:user_id => self.id}})
  end
end

または、Rails の古いバージョンを使用している場合MetaWhere:

def all_trips
  Trip.joins(:groups).where("(trips.user_id = ?) OR (groups.user_id = ?)", self.id, self.id)
end
于 2012-04-14T10:39:16.140 に答える