0

これへのポインターをどこでも検索しましたが、見つかりません。基本的には、:has_many、:through の方法でポリモーフィックなリレーションシップを作成するときに他の人がやりたいことをしたいのですが、モジュールでやりたいのです。私は立ち往生し続け、単純なものを見落としているに違いないと思います。

ウィット:

module ActsPermissive
  module PermissiveUser
    def self.included(base)
      base.extend ClassMethods
    end
    module ClassMethods
      def acts_permissive
        has_many  :ownables
        has_many  :owned_circles, :through => :ownables
      end
    end
  end

  class PermissiveCircle < ActiveRecord::Base
    belongs_to    :ownable, :polymorphic => true
  end
end

次のような移行を使用します。

create_table :permissive_circles do |t|
  t.string :ownable_type
  t.integer :ownable_id
  t.timestamps
end

もちろん、その考えは、acts_permissive をロードするものは何でも、それが所有するサークルのリストを持つことができるということです。

簡単なテストの場合、私は持っています

it "should have a list of circles" do
  user = Factory :user
  user.owned_circles.should be_an_instance_of Array
end

これは失敗します:

Failure/Error: @user.circles.should be_an_instance_of Array
     NameError: uninitialized constant User::Ownable

私は試しました: :class_name => 'ActsPermissive::PermissiveCircle'has_many :ownables 行で使用すると、次のように失敗します:

Failure/Error: @user.circles.should be_an_instance_of Array
     ActiveRecord::HasManyThroughSourceAssociationNotFoundError:
      Could not find the source association(s) :owned_circle or 
      :owned_circles in model ActsPermissive::PermissiveCircle. 
      Try 'has_many :owned_circles, :through => :ownables, 
      :source => <name>'. Is it one of :ownable?

提案に従っている間、設定:source => :ownableは失敗します

Failure/Error: @user.circles.should be_an_instance_of Array
     ActiveRecord::HasManyThroughAssociationPolymorphicSourceError:
       Cannot have a has_many :through association 'User#owned_circles' 
       on the polymorphic object 'Ownable#ownable'

これは、非ポリモーフィックスルーで物事を行うことが必要であることを示唆しているようです。そこで、ここでのセットアップに似た circle_owner クラスを追加しました。

module ActsPermissive
  class CircleOwner < ActiveRecord::Base
    belongs_to :permissive_circle
    belongs_to :ownable, :polymorphic => true
  end

  module PermissiveUser
    def self.included(base)
      base.extend ClassMethods
    end
    module ClassMethods
      def acts_permissive
        has_many  :circle_owners, :as => :ownable
        has_many  :circles, :through => :circle_owners, 
                  :source => :ownable, 
                  :class_name => 'ActsPermissive::PermissiveCircle'
      end
    end

  class PermissiveCircle < ActiveRecord::Base
    has_many :circle_owners
  end
end

移行の場合:

create_table :permissive_circles do |t|
  t.string :name
  t.string :guid

  t.timestamps
end

create_table :circle_owner do |t|
  t.string  :ownable_type
  t.string  :ownable_id
  t.integer :permissive_circle_id
end

それでも失敗します:

Failure/Error: @user.circles.should be_an_instance_of Array
     NameError:
       uninitialized constant User::CircleOwner

それは私たちを最初に戻します。

  1. モジュールでかなり一般的な多態的 :has_many, :through のように見えることをどのように行うことができますか?
  2. あるいは、モジュールで機能するのと同様の方法でオブジェクトを任意のオブジェクトによって収集できるようにする良い方法はありますか?
4

1 に答える 1

1

:class_name を両方の :has_many 定義に追加すると、実際に機能することがわかりました (誰かがコメントしましたが、コメントを削除しました)。:has_many 定義に対してローカルであると思われるカスケード エラーを引き起こしているプログラム内の何かが原因で、単純化されていないプログラムでは機能しませんでした。

短編小説: 実際には問題にならなかったことが、大変なことでした。ブリーチ

于 2011-12-08T16:19:54.483 に答える