2014-09-18 2 views
1

레일의 STI 또는 기타 상속을 이해하지 못했습니다.레일 4 : 상속 관련 문제

양식이있는 디자인을 구현해야합니다. 업로드 할 때 제출하지만 사용자가 로그인하지 않은 경우 openid를 통해 로그인해야합니다 (지원되는 액세스 만 가능). 따라서 이것은 리다이렉트 (redirect)를 의미하며, 내가 지금까지 생각해 낼 수있는 가장 좋은 점은 일시적으로 데이터를 저장하는 것이고, 로그인에 성공하면 실제로 실제 객체를 생성한다는 것입니다. 개체에 대해 두 개의 개별 테이블을 갖고 싶었습니다. Site 개체는 생성 될 개체이고 Sitetmp은 임시 저장소이며 nonce라는 추가 필드가 있습니다.

DB를 (로그인에 성공한, 비표 비교되며, 확인되면, Sitetmp 인스턴스가 삭제되고 새로운 Site 하나 생성) :

#schema.rb 
create_table "sites", force: true do |t| 
    t.string "name" 
    t.date  "date" 
    t.text  "description" 
    t.float "lat" 
    t.float "lon" 
    t.date  "updated" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "sitetmps", force: true do |t| 
    t.string "nonce" 
    t.string "name" 
    t.date "date" 
    t.text "description" 
    end 

서브 클래스 :

#app/models/sitetmp.rb 
class Sitetmp < Site 
    attr_accessor :nonce 
end 

수퍼 클래스 :

#app/models/site.rb 
class Site < ActiveRecord::Base 
    validates :name, uniqueness: true, :presence => true, 
        :length => { :minimum => 5 } 
    validates :date, :presence => true 

    has_many :images, :inverse_of => :site 
end 

모두 설정 한 것 같았지만 실제로 로그인에 성공한 임시 개체에 액세스하려고 할 때, 그것은이되는 원인 컨트롤러 나

SQLite3::SQLException: no such column: sites.nonce: SELECT "sites".* FROM "sites" WHERE "sites"."nonce" = '059253928646750523787961570357' LIMIT 1 

에게 코드를 알려줍니다

분명히
if nonce 
      @tmp = Sitetmp.find_by nonce: nonce 

내가하여 Sitetmp 인스턴스에 액세스하려고 그 nonce 속성이 있지만 rails 클래스는 Site 클래스에 실제로 액세스하려고합니다 (nonce 속성이 없음).

내가 뭘 잘못하고 있니? 유효한 Site 개체를 만들기 위해 nonce에 의해 Sitetmp 개체를 올바르게 찾는 방법은 무엇입니까?

답변

1

제가 이해하기에, ActiveRecord::Basetable_name 방법을 가지고 있습니다. ActiveRecord::Base에서 상속받은 경우 일부 레일 마법을 통해 하위 클래스 (Site)의 밑줄이 그어진 자체 소문자로 설정된 table_name이 있습니다.

Site 클래스를 상속하는 경우 Sitetmptable_name 집합의 이점을 얻지 못합니다.

당신이 설정하여이 문제를 해결할 수 있습니다 :

#app/models/sitetmp.rb 
class Sitetmp < Site 
    # Set custom table name 
    table_name "sitetmp" 
    attr_accessor :nonce 
end 

이는 Site 클래스의 table_name에 영향을 미칠 것인지 나도 몰라, 그래서 당신은 단지 독립을 만들어야 할 수도 있습니다 Sitetmp 모델에서 작동합니다.

또는, 당신은 session에 값을로드 할 수 - 사실 see here for more

+0

, 나는 이미했던 독립 Sitetmp 클래스를 만들 수있는 제안에 대한 응답을 받아 :) – faboolous