通过多对多表查询多对多关系过滤,但按关联表的字段排序

时间:2019-04-28 03:09:14

标签: ruby-on-rails ruby many-to-many

我正在尝试查询多对多关系,同时对多对多表中的某个字段进行过滤,同时按关联表中的字段排序。

我如何获取特定公司的所有活跃的firm_emps并通过用户名订购firm_emps?

user.rb

Class User < ApplicationRecord
 has_many :firm_emps, :dependent => :destroy
 has_many :firms, through: :firm_emps
end

user.rb迁移文件

...
t.string :name
t.boolean :active
...

firm_emp.rb

Class FirmEmp < ApplicationRecord
 belongs_to :firm
 belongs_to :user
end

firm_emp.rb的迁移文件

...
 t.belongs_to :user, index: true
 t.belongs_to :firm, index: true
 t.boolean :admin, default: false
 t.boolean :active, default: true
...

firm.rb

Class Firm < ApplicationRecord
 has_many :firm_emps, dependent: :destroy
 has_many :users, through: :firm_emps
end

Firm.rb的迁移文件

...
t.string :full_name
t.boolean :active
...

我已经在Rails控制台中尝试了以下查询:

f = Firm.first
f.users.where(active: true).order('users.name asc')
# But this filters on User's table field active: true and not the FirmEmps table field active: true

f.users.joins(:firmemps).where(active: true).order('users.name asc')
# Just doesn't work
f.firm_emps.active.order('firm_emps.active')
# But i can't order by user's field 'name'

编辑: @PragyaSriharsh和@ArunEapachen的答案有效。

2 个答案:

答案 0 :(得分:0)

尝试:

f.users.joins(:firm_emps).where('firm_emps.active=?', true).order('users.name asc') 

如果不起作用,请使用sort_by方法。

答案 1 :(得分:-1)

尝试以下操作。

f = Firm.first
f.users.where('firm_epms.active = ?' , true).order('users.name asc')