3

バージョン追跡に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
4

3 に答える 3

0

試したことはありませんが、うまくいくかもしれません

class Version
  belongs_to :item, :polymorphic => true, :primary_key => 'TrackedExampleID'
  ...
end
于 2013-01-08T00:35:06.797 に答える