【问题标题】:ActiveRecord not using overridden table nameActiveRecord 不使用被覆盖的表名
【发布时间】:2016-12-12 22:00:33
【问题描述】:

对不起,如果以前有人问过这个问题。我是 ActiveRecord 的新手,并且正在使用 Rails 世界之外的远程旧版 sqlserver 数据库。两张表就是这样设置的

**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'

我是否正确设置了所有内容或遗漏了什么?

【问题讨论】:

  • 你能打印sql activerecord生成的内容吗? Student.joins(:status_code).where(status_code: {Name: 'Studying science'}).to_sql
  • 能否请您提供控制台的所有 SQL 输出?你说它似乎在使用status_code.Name,所以你应该得到一个 SQL 异常。试试Student.joins(:status_code).where(status_codes: {Name: 'Studying science'})
  • @NikitaMisharin 这是 sql "SELECT [student].* FROM [student] INNER JOIN [LookupStatusCode] ON [LookupStatusCode].[Id] = [student].[StatusCodeId] WHERE [status_code].[Name] = N'5'"。请注意 where 子句。似乎没有拿起表名
  • @fbelanger 仍然得到相同的 Invalid SQL 错误。请看我上面的sql。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

这应该做的工作

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

更新:

您也可以使用 arel 构建查询。

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

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

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

【讨论】:

  • 是的,尼基塔。这可行,但由于我已经定义了新的表名,我不想在查询中再次指定它。它不应该像在 sql 的 ON 部分那样获取定义的表名吗?或者可能有另一种方法来获得我正在寻找的结果?谢谢。
  • 有办法做到这一点。虽然,我现在不能提供一个例子。我会尽快(十二小时左右)更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2011-05-19
相关资源
最近更新 更多