在Rails中为联接表指定条件

时间:2015-05-09 21:59:09

标签: mysql ruby-on-rails postgresql

我正在尝试根据用户加入的时间对pod进行排序。用户和pod之间的关系由名为pod_users的连接表管理。

所以我有:

Pod.rb
has_many :pod_users, dependent: :delete_all
has_many :users, through: :pod_users

User.rb
has_many :pod_users
has_many :pods, through: :pod_users

Pod_user.rb
belongs_to :pod
belongs_to :user

当用户加入窗格时,会在pod_users中使用时间戳更新记录。我想根据created_at时间戳订购用户所属的pod列表。

以下是我根据specifying conditions on joined tables here的说明尝试的内容:

@pods = @user.pods.joins(:pod_users).where(pod_users: {user_id: @user.id}).order("pod_users.created_at DESC").paginate(page: params[:page])

我尝试过不同的版本。我也试过了:

@pods = @user.pods.joins(:pod_users).order("pod_users.created_at DESC").paginate(page: params[:page])

但后来我得到了重复项,因为pods有多个用户,当我执行pod_users连接时,会返回那些额外的记录。

有一种简单的方法吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

摆脱.joins(:pod_users)并立即开始工作。由于您有has_many :pods, through: :pod_users,因此当您执行@user.pods时,rails已将pod_users作为连接添加到sql查询中。如果您想检查一下,请在控制台中执行@user.pods.to_sql

如果你这样做,你的东西应该有用:

@pods = @user.pods.order("pod_users.created_at DESC").paginate(page: params[:page])