これへのポインターをどこでも検索しましたが、見つかりません。基本的には、: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
それは私たちを最初に戻します。
- モジュールでかなり一般的な多態的 :has_many, :through のように見えることをどのように行うことができますか?
- あるいは、モジュールで機能するのと同様の方法でオブジェクトを任意のオブジェクトによって収集できるようにする良い方法はありますか?