2013-05-22 2 views
0

Я хочу сделать STI в Rails.Области не работают с STI

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 

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 

И есть некоторая проблема с этими областями.

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

Я также попытался поставить эти области в UserForAdmin вместо AbstractUser с тем же результатом. Я (возможно) нуждаюсь в обласках вместо пользовательских методов, потому что я использую их в ActiveAdmin. Как я могу это решить?

+0

Каковы условия для возникновения ошибки? Какую область вы называете? Что вы ожидаете увидеть? –

+0

Это происходит, когда я пытаюсь «если UserForAdmin.not_on_waitlist.find (params [: id])' в контроллере ActiveAdmin. – ciembor

+0

Является ли запрос, что он пытается сделать неправильно? Похоже, он делает то, что вы просили, чтобы вы делали, поэтому вам нужно сказать, что вы ожидаете от этого. –

ответ

1

Если вы не хотите получать всех пользователей, вам необходимо запросить базовый класс. В более простом примере:

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] 

Таким образом, в вашем случае, вы хотите:

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

Если пользователь является UserForAdmin вы получите объект класса UserForAdmin. Если это всего лишь пользователь, вы получите объект класса User

+0

@ciembor сделал это, решив вашу проблему? –