1
우리는 포스트 그레스와 레일 그것은, 잘 작동하고있어 3으로하지만 새로운 ActiveAdmin을 모델을 추가 한 후 ActiveAdmin을하고 CircleCI을 사용하는

, 우리는 rake db:create db:schema:load 동안이 얻을 실패합니다 :는 ActiveAdmin을하고 CircleCI는 : 자동 로더는 포스트 그레스는

PG::UndefinedTable: ERROR: relation "external_videos" does not exist 
... 
/home/ubuntu/Swearnet/app/models/external_video.rb:11:in `<class:ExternalVideo>' 
/home/ubuntu/Swearnet/app/models/external_video.rb:1:in `<top (required)>' 
... 
/home/ubuntu/Swearnet/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.14/lib/active_support/dependencies.rb:190:in `const_missing' 
/home/ubuntu/Swearnet/app/admin/external_video.rb:1:in `<top (required)>' 
... 
/home/ubuntu/Swearnet/config/routes.rb:54:in `block in <top (required)>' 

새 파일을 제거하면 (이 파일이 다른 ActiveAdmin 파일과 크게 다르지 않지만) 오류가 사라집니다.

이 오류는 경로로 인해 ActiveAdmin이로드되어 ExternalVideo 모델이 자동로드되어 이로 인해 아직 생성되지 않은 external_videos 테이블을 찾지 못하는 것으로 보입니다. 다른 ActiveAdmin 파일에 대해이 문제가 발생하지 않는 이유는 무엇입니까? 다른 사람이 전에 이런 종류의 문제에 부딪 혔습니까?

우리의 새로운 파일이 app/admin/external_videos.rb과 같습니다

ActiveAdmin.register ExternalVideo do 
    menu :parent => "Shows" 

    form do |f| 
    f.inputs nil do 
     f.input :title 
     f.input :description 
     f.input :published_at 
     f.input :expires_at 
    end 
    f.actions 
    end 
end 

편집 : 우리는 문제를 발견이 ... ExternalVideo의 범위 find_by_sxg_id 이름이 있었다. 해당 범위를 get_by_sxg_id으로 바꾸면 모든 것이 작동합니다. 저는 손실이 있습니다 ... 나는 find_by이 일반적으로 마법 ActiveRecord 접두사라는 것을 알고 있지만, 레이크 작업에서 생성되기 전에 단순한 정의로 인해 테이블에 액세스하는 방법을 알지 못합니다 ...

답변

2

이것은입니다 ActiveRecord를 사용할 때 공통적으로 발생하는 문제이며,이 버그가있는 첫 번째 사용자는 아닙니다! 매우 일반적인 우리는 그것에 문서를 썼습니다 : https://circleci.com/docs/ruby-exception-during-schema-load

+0

물론 나는 그 의사를 보았습니다. 문제는 범위의 단순한 이름으로 인해이 문제가 발생했다는 것입니다. – singpolyma

+0

흠, 나는 그것이 조금 분명하지 않다고 생각한다. activerecord에서 이름을 사용하면 모델이로드되고 모델은 데이터베이스 스키마 인트로 스펙 션에 의존합니다. DB가 없기 때문에 DB가 손상됩니다. 이해가 되니? –

3

조금 더 많은 정보를 원하면이 정보가 도움이되기를 바랍니다. activeadmin과 관련하여이 문제가 발생한 곳은 두 곳이었습니다.

1. 검색 필터에서 모음을 정의 할 때 proc {}을 선언하지 못했습니다. 예를 들어

:

filter :association_id, as: :select, collection: Association.all, label: "Association" 

은 인덱스 페이지가 실제로로드 될 때까지 모델 부하를 연기 하

filter :association_id, as: :select, collection: proc { Association.all }, label: "Association" 

하고 원 CI는 DB를 완료 할 수 있도록해야한다 : 스키마 : 부하를 (또는

2. 리소스를 등록하면 모델 정의가로드되고 해당하는 경우에는 모델 정의가로드됩니다. Circle CI는 Postgres 오류를 줄 것이므로 아무 것도 얻을 수 없습니다.

뒤늦은 지혜로는 알 수있을지라도이 방법은 찾기가 더 까다 롭습니다. 그래서, 예를 들어 당신이 "초기 활성, 비활성"상태와 "롤 - 네 - 자신의"상태 머신이 있고 쿼리 메소드의 집합을 정의하기를 원한다면, 당신은이 작업을 수행 할 수 있습니다 그래서

def states 
    [ :initial, :active, :inactive ] 
end 

def self.included(Model) 
    states = Model.new.states 
    states.each do |state| 
    base.send(:define_method, "#{state}?") do 
    self.state == state 
end 

리소스를로드하기 위해서 우리는 모델 (Model.new 라인)을 인스턴스화해야한다. 이 문제를 해결하기 위해 다음과 같이 변경했습니다 :

def self.states 
    [ :initial, :active, :inactive ] 
end 

def self.included(Model) 
    states = Model.states 
    states.each do |state| 
    base.send(:define_method, "#{state}?") do 
    self.state == state 
end 

희망이 있습니다.

+0

고마워, 그냥 내 사건을 해결해! – ifyouseewendy