使用arel查询关联字段(多对多的实现)

时间:2017-01-04 10:14:25

标签: ruby-on-rails ruby associations arel

我有很多这样的关系:

class User < ApplicationRecord
    has_and_belongs_to_many :letter_trackings
end

class LetterTracking < ApplicationRecord
    has_and_belongs_to_many :assignees, class_name: "User"
end

我想使用arel来搜索这样的受理人:

users = User.arel_table
letter_trackings = LetterTracking.arel_table

@users = User.where(users[:name].matches("%#{Afsane Fadaei}%"))
@assignees_ids = @users.pluck(:id).uniq
letters_query = letter_trackings[:assignees].in(@assignees_ids)
@letter_trackings = LetterTracking.where(letters_query)

但它会返回此错误:

ActionView::Template::Error (SQLite3::SQLException: no such column: letter_trackings.assignees: SELECT "letter_trackings".* FROM "letter_trackings" WHERE "letter_trackings"."assignees" IN (1189)):

那是因为我不知道如何在 arel 中查询关联(多对多)列。

任何想法?

1 个答案:

答案 0 :(得分:1)

您需要获取用于创建HABTM关联的联接表,并搜索assignee_id或user_id,以便在信件跟踪中查询受理人。您可以将以下代码段作为参考。我认为联接表是LetterTrackingUsers。

letter_trackings = LetterTracking.arel_table
letter_trackings_users = LetterTrackingUsers.arel_table # here use HABTM table used by you for joining users and letter_trackings

query = letter_trackings_users[:user_id].in(@assignees_ids)  
or 
query = letter_trackings_users[:assignee_id].in(@assignees_ids)

@letter_trackings = LetterTracking.where(letters_query)