Перечисление всех экземпляров модели документа, которая принадлежит пользователю через групповые отношения
Я в основном следовал руководству 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