【发布时间】:2013-01-08 00:11:09
【问题描述】:
我有几个 ActiveRecord 类使用paper_trail 进行版本跟踪。 AR 类具有基于其表名的自定义主键(例如 Item.ItemID 而不是 Item.id),以遵守业务 DB 约定。
paper_trail 指定每个跟踪类的多态关系,因此:
class TrackedExample < ActiveRecord::Base
set_table_name 'TrackedExample'
set_primary_key 'TrackedExampleID'
# simplified from https://github.com/airblade/paper_trail/blob/master/lib/paper_trail/has_paper_trail.rb
has_many :versions
:class_name => 'Version'
:as => :item,
end
class AnotherTrackedExample
set_table_name 'AnotherTrackedExample'
set_primary_key 'AnotherTrackedExampleID'
has_many :versions
:class_name => 'Version'
:as => :item,
end
# from https://github.com/airblade/paper_trail/blob/master/lib/paper_trail/version.rb
class Version
belongs_to :item, :polymorphic => true
...
end
如果我没有使用自定义主键,版本对象可以使用Version#item 引用被跟踪的对象(即它是版本的对象)。当我尝试它时,我得到一个错误:
# This should give back `my_tracked_example`
my_tracked_example.version.first.item
=> TinyTds::Error: Invalid column name 'id'.: EXEC sp_executesql N'SELECT TOP (1) [TrackedExample].* FROM [TrackedExample] WHERE [TrackedExample].[id] = 1 ORDER BY TrackedExample.TrackedExampleID ASC'
有没有办法让 Version#item 执行正确的查询?我希望是这样的:
EXEC sp_executesql N'SELECT TOP (1) [TrackedExample].* FROM [TrackedExample] WHERE [TrackedExample].[TrackedExampleID] = 1 ORDER BY TrackedExample.TrackedExampleID ASC'
我正在通过 TinyTDS 和 activerecord-sqlserver-adapter 使用 Rails 3.1.0、paper_trail 2.6.4 和 MS SQL Server。
编辑:我通过添加引用主键值的计算列 TrackedExample.id 和 AnotherTrackedExample.id 解决了这个问题。这不是一个合适的解决方案(Rails 仍在进行错误的查询),但它可能对其他匆忙的人有用。
MS SQL:
ALTER TABLE TrackedExample
ADD COLUMN id AS TrackedExampleID
【问题讨论】:
标签: ruby-on-rails polymorphic-associations