通过'has_many through'关系与至少一个匹配对象的行

时间:2015-12-21 11:40:17

标签: ruby-on-rails activerecord

我的模型设置如下:

class Record < ActiveRecord::Base
    belongs_to :activity
    has_many :codes, -> { order("codes.name") }, through: :activity

class Activity < ActiveRecord::Base
    has_many :activity_code_links
    has_many :codes, through: :activity_code_links
    has_many :records

class ActivityCodeLink < ActiveRecord::Base
    belongs_to :activity
    belongs_to :code

class Code < ActiveRecord::Base
    has_many :activity_code_links
    has_many :activities, through: :activity_code_links
    has_many :records, through: :activities

在控制器中,我有一个ActiveRecord记录关系,@records。 我希望我生成的@records只包含具有特定代码的记录。

目前,我正在使用以下解决方案;但它效率不高,并且还返回一个数组,而不是ActiveRecord关系:

  @records = @records.reject { |record| (record.codes & [code]).empty? }

任何帮助将不胜感激

干杯

2 个答案:

答案 0 :(得分:1)

@records.joins(:codes).where(codes: {id: code.id})

请注意,如果您以后不需要使用代码实体,则应使用joins代替includes,因为它无法实例化ActiveRecord对象,从而增加了开销

答案 1 :(得分:0)

@records = @records.includes(:codes).where(codes: {id: code.id})

其中code是您想要过滤的代码对象。