ActiveRecord不使用重写的表名

时间:2016-12-12 22:00:34

标签: ruby-on-rails ruby activerecord

很抱歉,如果之前有人询问过。我是ActiveRecord的新手,并且在rails世界之外使用远程遗留sqlserver数据库。这就是设置2个表的方法

**Student**                             **LookupStatusCode**
Identifier(PK)   StatusCodeId            Id(PK)    Code   Name        
1234               2                      1       4     Studying maths 
3456               1                      2       6     Studying science

这就是我设置模型的方式

class Student < ActiveRecord::Base     
  self.table_name "Student" #use singular table name                
  belongs_to :status_code, foreign_key: 'StatusCodeId'                  
end

class StatusCode < ActiveRecord::Base
  self.table_name "LookupStatusCode" #use singular table name
  has_many :students
end

如何找到所有学生,例如学习科学?

我试过 - Student.joins(:status_code).where(status_code: {Name: 'Studying science'}) 但它似乎在where子句中使用status_code.Name而不是LookupStatusCode.Name

这是它生成的SQL。请注意,sql的WHERE部分不使用重写的表名。

SELECT [student].* FROM [student] INNER JOIN [LookupStatusCode] ON [LookupStatusCode].[Id] = [student].[StatusCodeId] WHERE [status_code].[Name] = N'5'

我是否正确设置了一切或者我错过了什么?

1 个答案:

答案 0 :(得分:0)

这应该做的工作

Student.joins(:status_code).where('LookupStatusCode' => {Name: 'Studying science'})

<强>更新

作为替代方案,您还可以使用arel。

构建查询

首先,您需要将include ArelHelpers::ArelTable添加到StatusCode模型中。

然后,您将能够构建以下查询

Student.joins(:status_code).where(StatusCode['Name'].eq('Studying science'))