使用has_many通过访问连接表中的属性

时间:2013-12-05 00:32:19

标签: ruby-on-rails associations has-many

我通过关联与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。* FROM trips INNER JOIN trips_users ON tripsid   = trips_userstrip_id WHERE trips_usersuser_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

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记录,但也希望加载这些行程,以便访问它们不会再次访问数据库。