ActiveRecord:where语句中关联模型的引用属性

时间:2015-07-02 19:30:46

标签: ruby-on-rails activerecord

我有两个具有has_many / has_many关系的模型。我有一个变量exp_ids,它是一个整数数组,表示一些ExperienceLevel记录的id。我需要编写一个查询,选择所有JobDescriptionExperienceLevel,其中包含其中一个ID。

查询必须对名为job_descriptions的现有ActiveRelation对象起作用,该对象通过控制器中的某些流控制传递,以根据我的参数过滤结果。

我在下面尝试了这些查询以及其他一些变体,但收效甚微。据我所知,ActiveRecord认为experience_levels是一个属性,导致它失败。

  • job_descriptions.where(experience_levels: exp_ids)
  • job_descriptions.joins(:experience_levels).where(experience_levels.id: exp_ids)
  • job_descriptions.joins(:experience_levels).where(experience_levels: exp_ids)
  • job_descriptions.joins(:experience_levels).where("experience_levels.id IN exp_ids")
  • job_descriptions.includes(:experience_levels).where("experience_levels.id = ?", exp_ids).references(:experience_levels)

以下是我的模特:

class JobDescription < ActiveRecord::Base
    has_many :job_description_experience_levels
    has_many :experience_levels, through: :job_description_experience_levels
end

class JobDescriptionExperienceLevel < ActiveRecord::Base
    belongs_to :job_description
    belongs_to :experience_level
end

class ExperienceLevel < ActiveRecord::Base
    has_many :job_description_experience_levels
    has_many :job_descriptions, through: :job_description_experience_levels
end

我不确定我想做什么是可能的。我在另一个job_description过滤器中使用了类似的方法,我选择了company_id,但在这种情况下,company_idJobDescription的属性。

3 个答案:

答案 0 :(得分:1)

试试这个:

job_descriptions.joins(:job_description_experience_levels).where(job_description_experience_levels: { experience_level_id: exp_ids })

答案 1 :(得分:1)

job_descriptions.joins(:experience_levels).where(experience_levels:{id:exp_ids})

答案 2 :(得分:0)

试试这个。注意经验水平缺乏复数.id

job_descriptions.includes(:experience_levels).where("experience_level.id = ?", exp_ids).references(:experience_levels)