我基本上遵循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方法。在这一点上,一切似乎对我有用。
答案 0 :(得分:2)
哦!我想我得到的是你想要做的以及为什么这是一个问题。我想知道为什么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
或者,如果您使用的是没有MetaWhere
的旧版Rails:
def all_trips
Trip.joins(:groups).where("(trips.user_id = ?) OR (groups.user_id = ?)", self.id, self.id)
end