2012-01-16 1 views
0

다음 모델 (레일즈 3.2rc1)에 대해서는 약간의 문제가 있습니다. 소유권은 사용자 (소유자)에게 프로젝트와 블로그를 매핑하고 소유권을 다르게 처리하는 여러 유형의 블로그가 있습니다.has_many : 하나의 다형성 및 서브 클래 싱 된 다리 오작동과의 관계를 통해

class User < ActiveRecord::Base 
    has_many :ownerships, dependent: :destroy 
    has_many :projects, through: :ownerships, source: :ownable, :source_type => 'Project' 
    has_many :site_blogs, through: :ownerships, source: :ownable, :source_type => 'SiteBlog' 
end 

class Ownership < ActiveRecord::Base 
    belongs_to :ownable, polymorphic: true 
    belongs_to :owner, :class_name => 'User', foreign_key: 'user_id' 
end 

class Project < ActiveRecord::Base 
    has_many :owners, through: :ownerships, as: :ownable 
    has_many :ownerships, as: :ownable, dependent: :destroy 
end 

class Blog < ActiveRecord::Base 
end 

class SiteBlog < Blog 
    has_many :owners, through: :ownerships, as: :ownable 
    has_many :ownerships, as: :ownable, dependent: :destroy 
end 

class ProjectBlog < Blog 
    belongs_to :project 
end 
그것은 모두가 지금까지 잘 작동

하지만 SiteBlog#owners 무례한 행동 :

SiteBlog.first.owners 
    SiteBlog Load (0.8ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."type" IN ('SiteBlog') LIMIT 1 
    User Load (1.4ms) SELECT "users".* FROM "users" INNER JOIN "ownerships" ON "users"."id" = "ownerships"."user_id" WHERE "ownerships"."ownable_id" = 231145885 AND "ownerships"."ownable_type" = 'Blog' 
=> [] 

문제는 생성 된 SELECT의 매우 끝 : "ownable_type" = 'Blog'. 이것이 작동하려면, 그것은 "ownable_type" = 'SiteBlog'이어야합니다, 그러나 AREL에게 그렇게하도록 가르치는 방법을 알지 못합니다.

아이디어가 있으십니까?

답변

0

예를 기반으로 작은 레일 앱을 만들었습니다. 그리고 그것은 잘 작동합니다.

User.create 
SiteBlog.create 
SiteBlog.first.owners << User.first 

이것은 당신이, ownable_type은 "블로그"아닙니다 "SiteBlog"을 참조하십시오으로 소유권 기록을

#<Ownership id: 5, ownable_id: 5, ownable_type: "Blog", user_id: 5, created_at: 2012-01-17 20:14:01", updated_at: "2012-01-17 20:14:01"> 

을 만듭니다. 그 다음 :

SiteBlog.first.owners 
SiteBlog Load (0.3ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."type" IN ('SiteBlog') LIMIT 1 
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "ownerships" ON "users"."id" = "ownerships"."user_id" WHERE "ownerships"."ownable_id" = 5 AND "ownerships"."ownable_type" = 'Blog' 
=> [#<User id: 5, created_at: "2012-01-17 19:44:45", updated_at: "2012-01-17 19:44:45">] 

그래서 - 쿼리가 작동합니다.

그리고 여기에 주요 부분이 있습니다. 액티브/lib 디렉토리/액티브/협회/association.rb 봐 : 기본 클래스 이름을 쓰기로되어 난간

def creation_attributes 
    attributes = {} 

    if reflection.macro.in?([:has_one, :has_many]) && !options[:through] 
    attributes[reflection.foreign_key] = owner[reflection.active_record_primary_key] 

    if reflection.options[:as] 
     attributes[reflection.type] = owner.class.base_class.name 
    end 
    end 

    attributes 
end 

특히이 라인 텔링 - 즉 블로그입니다, 아니 SiteBlog : 그래서

attributes[reflection.type] = owner.class.base_class.name 

- 모든 것이 당신의 예제와 Rails의 행동으로 잘된 것처럼 보입니다.

+0

이것은 약간 당황 스럽습니다. 실제로는 작동합니다. 오타가 내 평가판 앱에서 문제를 일으켰습니다. 이를위한 스펙을 작성할 시간. – svoop