バージョン追跡にpaper_trailを使用するいくつかの ActiveRecord クラスがあります。AR クラスには、ビジネス DB の規則に準拠するために、テーブル名に基づくカスタムの主キーがあります (例:Item.ItemID
の代わりに)。Item.id
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'
私は Rails 3.1.0、paper_trail 2.6.4、および TinyTDS とactiverecord-sqlserver-adapterを介して MS SQL Server を使用しています。
編集:TrackedExample.id
計算列を追加AnotherTrackedExample.id
し、主キー値を参照することで問題を回避しました。これは適切な解決策ではありません (Rails は依然として間違ったクエリを作成しています) が、急いでいる他のユーザーには役立つかもしれません。
MS SQL:
ALTER TABLE TrackedExample
ADD COLUMN id AS TrackedExampleID