Rails - 使用与自定义命名关联的连接

时间:2017-08-29 19:49:52

标签: ruby-on-rails ruby postgresql activerecord ruby-on-rails-5

我有以下型号

class Measurement < ApplicationRecord
  belongs_to :examination, class_name: "TestStructure", foreign_key: "examination_id"

end

该关联实际上是针对TestStructure模型的,但关联名称是检查。 没有检查表。

当我使用join查询时出现问题。以下查询

Measurement.joins(:examination).where(examination: { year: 2016, month: 5 })

失败,出现此错误

ActiveRecord::StatementInvalid:
   PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "examination"
   LINE 1: ...d" = "measurements"."examination_id" WHERE "examinati...
# --- Caused by: ---
 # PG::UndefinedTable:
 #   ERROR:  missing FROM-clause entry for table "examination"
 #   LINE 1: ...d" = "measurements"."examination_id" WHERE "examinati...

很明显,examinations表不存在,但我找不到告诉ActiveRecord的方法我使用的是命名关联而不是默认关联。

任何见解?

4 个答案:

答案 0 :(得分:6)

where需要实际的表名,只需将其插入SQL:

Article.where(whatever: {you: 'want'}).to_sql
=> "SELECT `articles`.* FROM `articles` WHERE `whatever`.`you` = 'want'"

所以你可以使用:

Measurement.joins(:examination).where(test_structures: { year: 2016, month: 5 })

但它不好

然后你依赖于表名,而Model应该抽象这样的东西。您可以使用merge

Measurement.joins(:examination).merge(TestStructure.where(year: 2016, month: 5))

答案 1 :(得分:4)

对于联接,您使用关联名称,但需要使用表名称

Measurement.joins(:examination).where(test_structures: { year: 2016, month: 5 })

Measurement.joins(:examination).where('test_structures.year': 2016, 'test_structures.month': 5 )

答案 2 :(得分:1)

在此示例中,应在examinations方法中提供表名examination,而不是关联名称where

Measurement.jons(:examination).where(examinations: { year: 2016, month: 5 })

答案 3 :(得分:0)

在某些情况下,您需要添加.references(associations)

Measurement.joins(:examination).merge(TestStructure.where(year: 2016, month: 5)).references(:examination)