2013-05-22 6 views
0

레일에서 STI를 수행하고 싶습니다. 범위가 STI에서 작동하지 않습니다.


require 'rfc822' 

class User < AbstractUser 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :confirmable 

    validates :name, :presence => true 
    validates :surname, :presence => true 
    validates :title, :presence => true 
    validates :password, :presence => true, :length => { :minimum => 8 } 
    validates :email, :presence => true, :format => { :with => RFC822::EMAIL_REGEXP_WHOLE } 

    attr_accessible :name, :surname, :title, :organization, 
        :email, :password, :fullname 
end 

require 'rfc822' 

class UserForAdmin < AbstractUser 
    validates :email, :presence => true, :format => { :with => RFC822::EMAIL_REGEXP_WHOLE } 
    validates :organization_id, :presence => true 

    attr_accessible :name, :surname, :title, :organization, :email, 
        :password, :fullname, :password_confirmation, :type, 
        :organization_id, :waitlist, :invitation_token 
end 

그리고이 범위에 일부 문제가

class AbstractUser < ActiveRecord::Base 
    self.table_name = 'users' 

    belongs_to :organization, :inverse_of => :users 

    # reporter user 
    has_many :requests, :dependent => :destroy 

    # startup user 
    has_many :responses, :dependent => :destroy 
    has_many :startup_requests, :through => :responses, :source => :request 

    scope :reporters, where(:type => 'Reporter') 
    scope :startup_employees, where(:type => 'Startup') 
    scope :on_waitlist, where(:waitlist => true) 
    scope :not_on_waitlist, where(:waitlist => false) 

end 

.
Couldn't find UserForAdmin with id=7 [WHERE "users"."type" IN ('UserForAdmin') AND "users"."waitlist" = 'f'] 

나는 같은 결과 UserForAdmin 대신 AbstractUser 이러한 범위를 넣어했습니다. ActiveAdmin에서 사용하기 때문에 나는 (아마도) 사용자 정의 메서드 대신 범위가 필요합니다. 이 문제를 어떻게 해결할 수 있습니까?

+0

오류 발생 조건은 무엇입니까? 어느 범위에 전화하고 있습니까? 너는 무엇을 기대하니? –

+0

ActiveAdmin의 컨트롤러에서'if UserForAdmin.not_on_waitlist.find (params [: id])'를 시도 할 때 발생합니다. – ciembor

+0

잘못 수행하려고 시도한 쿼리입니까? 네가 한 일은 네가 한 일이라고 생각하니 네가 기대하는 바를 말할 필요가있어. –

답변

1

모든 사용자를 수신하지 않으려면 기본 클래스로 쿼리해야합니다. 간단한 예에서이 사용자가 UserForAdmin입니다

AbstractUser.not_on_waitlist.find(params[:id]) 

경우 클래스 UserForAdmin의 객체를 받게됩니다 :

class Animal < ActiveRecord::Base 
end 

class Dog < Animal 
end 

class Cat < Animal 
end 

Dog.create 
Cat.create 

Animal.all 
=> [dog, cat] 

Dog.all 
=> [dog] 

Cat.all 
=> [cat] 

그래서, 당신의 경우에, 당신이 원하는 것입니다. 사용자 인 경우 클래스 객체를 받게됩니다. User

+0

@ciembor이 문제가 해결 되었습니까? –

관련 문제