我通过关联与has_many有很多关系:
class User < ActiveRecord::Base
has_many :trips_users
has_many :trips, through: :trips_users
end
class Trip < ActiveRecord::Base
has_many :trips_users
has_many :users, through: :trips_users
end
class TripsUser < ActiveRecord::Base
belongs_to :user
belongs_to :trip
end
加入表trips_user包含一个名为'pending'的列,当我要求用户的行程列表时,该列就像get一样。
因此,在我的控制器中,我需要获得用户拥有的所有行程,同时还要添加“待定”列。
我在尝试
current_user.trips.includes(:trips_users)
将由此select语句完成:
SELECT
trips
。* FROMtrips
INNER JOINtrips_users
ONtrips
。id
=trips_users
。trip_id
WHEREtrips_users
。user_id
= 3
缺少我想要的trips_users表中的信息。
所需的sql是:
SELECT旅行。*,trips_users。* FROM旅行INNER JOIN trips_usersON trips.id = trips_users.trip_id WHERE trips_users.user_id = 3
答案 0 :(得分:1)
这终于奏效了:
current_user.trips.select('trips_users.*, trips.*')
覆盖SQL的选择部分。
在我看来,我不是很漂亮,我不应该弄乱表格和查询而是模型,特别是在m2m关联的常见情况下,中间有额外的数据。
答案 1 :(得分:0)
您需要使用joins
而不是包含此内容...请参阅以下Rails指南:
http://guides.rubyonrails.org/active_record_querying.html#joining-tables
基本上你会做这样的事情:
current_user.trips.joins(:trips_users)
includes
方法用于预先加载,而joins
实际执行表连接。
答案 2 :(得分:0)
您也可以尝试:
trips_users = current_user.trips_users.includes(:trip)
trips_users.first.pending?
trips_users.first.trip
哪个应该为您提供该用户的trips_users记录,但也希望加载这些行程,以便访问它们不会再次访问数据库。