私は、任意のモデルがPermitasPermissibleとhas_manyアソシエーションを持つことができるエンジンに取り組んでいます。
class Permit < ActiveRecord::Base
belongs_to :permissible, polymorphic: true
end
module Permissible
def self.included(base)
base.class_eval do
has_many :permits, as: :permissible
end
end
class Group < ActiveRecord::Base
include Permissible
end
class GroupAllocation < ActiveRecord::Base
belongs_to :person
belongs_to :group
end
class Person < ActiveRecord::Base
include Permissible
has_many :group_allocations
has_many :groups, through: :group_allocations
end
class User < ActiveRecord::Base
belongs_to :person
end
したがって、Group has_many:permitsとPerson has_many:permitsです。私がやろうとしているのは、許可アソシエーションをソースとして使用するユーザーにアソシエーションを動的に作成し、同じことを行うことで他のモデルのアソシエーションをユーザーにチェーンすることです。これは、手動で(Rails 3.1以降で)次の方法で実行できます。
class Person
has_many :group_permits, through: :person, source: :permits
end
class User
has_many :person_permits, through: :person, source: :permits, class_name: Permit
has_many :person_group_permits, through: :person, source: :group_permits, class_name: Permit
end
ただし、実際には、Permissibleは多くのモデルに含まれているため、User.reflect_on_all_associationsをトラバースして、新しいアソシエーション。それぞれが深いアソシエーションである可能性があります。
Rails3.2.8でこれをきれいに行う方法についての入力を探しています。