Mysql2::Error: after updating to Rails 4.1

Mysql2::Error: after updating to Rails 4.1

我最近将我的 Rails 应用程序从 4.0 更新到 4.1。一切似乎都工作正常,除了我之前工作的搜索模型中的这一行。

本质上,我想 search/find District_Resources 通过标签名称和 District_Resource 名称。

**ex.**
If I search the word "Tutoring" 
*I should get all District_Resources with the Resource_Tag "Tutoring"
*And all District Resources that include the word Tutoring in it's Name. 
(i.e Tutoring Services)

出于某种原因,我不断收到此错误:

(Mysql2::Error: Unknown column 'resource_tags.name' in 'where 
clause': SELECT `district_resources`.* FROM `district_resources`  
WHERE (resource_tags.name like '%Tutoring%' OR district_resources.name like '%Tutoring%')  
ORDER BY `district_resources`.`name` ASC):

但是 Resource_Tags table 中确实存在该列。

型号

class DistrictResource < ActiveRecord::Base

  has_many :district_mappings, dependent: :destroy
  has_many :resource_tags, through: :district_mappings

  accepts_nested_attributes_for :resource_tags
end

class ResourceTag < ActiveRecord::Base

  has_many :district_mappings, dependent: :destroy
  has_many :district_resources, through: :district_mappings

end

class Search < ActiveRecord::Base

  def district_resources
    @district_resources ||= find_district_resources
  end

  def find_district_resources
    district_resources = DistrictResource.order(:name)

    district_resources = district_resources.includes(:resource_tags).where("resource_tags.name like :name OR district_resources.name like :name", {:name => "%#{name}%" })

    district_resources
  end

end

架构

create_table "district_resources", force: true do |t|
  t.string   "name"
  t.string   "description"
  t.string   "website"
  t.string   "phone"
  t.string   "email"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "district_mappings", force: true do |t|
  t.integer  "district_resource_id"
  t.integer  "resource_tag_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "resource_tags", force: true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end

已修复!!

district_resources = district_resources.includes(:resource_tags).where("resource_tags.name like :name OR district_resources.name like :name", {:name => "%#{name}%" }).references(:resource_tags)

我不得不参考 Resource_Tags 模型

您在 where 子句中引用了 district_resources,但由于您急于加载,因此未加入查询 resource_tags 因此这里有两个解决方案

1.

district_resources = district_resources.joins(:resource_tags).where("resource_tags.name like :name OR district_resources.name like :name", {:name => "%#{name}%" })

2.

district_resources = district_resources.includes(:resource_tags).refereces(resource_tags).where("resource_tags.name like :name OR district_resources.name like :name", {:name => "%#{name}%" })

在这两种情况下,我们都在告诉 rails 我们在 where 子句中使用了 resource_tags table,因此将 district_resources 加入其中