我目前正在运行:
Windows 7 64-bit
Rails 4.1.1
Ruby 2.0.0p481
tiny_tds [gem] 0.6.2
我已经成功启动了一个 Rails 应用程序来访问远程 SQL Server(我不确定服务器的版本是什么)。我有一个模型,resource.rb
具有以下关联:
class Resource < ActiveRecord::Base
self.table_name = 'tResources'
self.primary_key = 'emp_Id'
has_many :project_resources, foreign_key: 'emp_Id'
has_many :projects, through: :project_resources
...
default_scope { order("#{Resource.table_name}.lastname ASC") }
...
该模型project_resource.rb
具有以下内容:
class ProjectResource < ActiveRecord::Base
self.table_name = 'tProject_Resources'
self.primary_key = 'key_Id'
belongs_to :project
belongs_to :resource, foreign_key: 'emp_Id'
belongs_to :calendar
...
这一切都很好。如果我有资源,我可以通过引用r
获得所有与之关联的项目。但是,这个关联中有一些重复的项目,所以在我看来,我目前正在成功使用.r
r.projects
r.projects.uniq
我想将其移至uniq
如下has_many
:
has_many :projects, -> { uniq }, through: :project_resources
以这种方式定义关联后r.projects
,我尝试过的唯一成功的参考是:r.projects.count
它确实为我提供了资源的唯一项目的准确计数r
。
但是,其他引用(例如r.projects
simple )会产生 TinyTDS 错误:
irb(main):010:0> r.projects
Project Load (290.0ms) EXEC sp_executesql N'SELECT DISTINCT *, __order FROM (
SELECT [tProjects].*, DENSE_RANK() OVER (ORDER BY name ASC) AS __order, ROW_NUM
BER() OVER (PARTITION BY [tProjects].* ORDER BY name ASC) AS __joined_row_num FR
OM [tProjects] INNER JOIN [tProject_Resources] ON [tProjects].[project_Id] = [tP
roject_Resources].[project_id] WHERE [tProject_Resources].[emp_Id] = @0 ) AS __s
q WHERE __joined_row_num = 1 ORDER BY __order', N'@0 int', @0 = 471 [["emp_Id",
471]]
TinyTds::Error: Incorrect syntax near '*'.: EXEC sp_executesql N'SELECT DISTINCT
*, __order FROM ( SELECT [tProjects].*, DENSE_RANK() OVER (ORDER BY name ASC) A
S __order, ROW_NUMBER() OVER (PARTITION BY [tProjects].* ORDER BY name ASC) AS _
_joined_row_num FROM [tProjects] INNER JOIN [tProject_Resources] ON [tProjects].
[project_Id] = [tProject_Resources].[project_id] WHERE [tProject_Resources].[emp
_Id] = @0 ) AS __sq WHERE __joined_row_num = 1 ORDER BY __order', N'@0 int', @0
= 471
ActiveRecord::StatementInvalid: TinyTds::Error: Incorrect syntax near '*'.: EXEC
sp_executesql N'SELECT DISTINCT *, __order FROM ( SELECT [tProjects].*, DENSE_R
ANK() OVER (ORDER BY name ASC) AS __order, ROW_NUMBER() OVER (PARTITION BY [tPro
jects].* ORDER BY name ASC) AS __joined_row_num FROM [tProjects] INNER JOIN [tPr
oject_Resources] ON [tProjects].[project_Id] = [tProject_Resources].[project_id]
WHERE [tProject_Resources].[emp_Id] = @0 ) AS __sq WHERE __joined_row_num = 1 O
RDER BY __order', N'@0 int', @0 = 471
我正在寻找一些关于为什么会发生此错误的指导。谢谢。