Перечисление всех экземпляров модели документа, которая принадлежит пользователю через групповые отношения

Я в основном следовал руководству ROR, http://guides.rubyonrails.org/association_basics.html, чтобы создать модели отношений, как показано ниже.

Из-за сквозной связи я подумал, что @ user.trips даст вам как поездки, которые создал пользователь, так и поездки, которые принадлежат пользователю. Тем не менее, когда я делаю @user.trips.count в консоли результатом было только количество поездок, созданных пользователями; поездки, которые принадлежали пользователю через ассоциацию 'group', не учитывались.

Вопрос: Как я могу получить в моем представлении отображение как поездок, которые создал пользователь, так и поездок, к которым он относится, через "группу"?

Пользователь / 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. На данный момент у меня все работает.

1 ответ

Решение

Ой! Я думаю, я понимаю, что вы пытаетесь сделать, и почему это проблема. Мне было интересно почему has_many :trips был вызван дважды. Но из того, что я понимаю, у вас есть два разных User-Trip отношения. Эти двое не могут иметь одно и то же имя, иначе одно скроет другое. Попробуйте что-то вроде этого:

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
Другие вопросы по тегам