Ruby Gem 기여 사례 연구: activeadmin mongoid
6017 단어 railsactiveadminruby
Rails 개발에 관심이 많은 사람들에게는 한 프로젝트에서 Activeadmin을 사용해야 한다.없으면, have a look at it.은 매우 이해가 가는 지역사회 경영의 신기한 보석입니다.
Rails에 익숙하지 않은 사람들에게 이gem는 응용 프로그램의 모델을 신속하게 구축하는 관리 컨트롤러의 기능을 제공합니다.약정 세트를 제공하고 이 약정에 따라 작업을 하면 계기판을 신속하게 준비할 수 있습니다.Django에 익숙한 사람에게는 Django admin과 유사합니다.
gem
activeadmin
은 Rails activerecord
을 사용하는 관계 데이터베이스와 잘 어울린다. NosQL 데이터베이스(예를 들어 Mongo)를 사용하는 프로젝트에 대해 같은 프레임 아래 또 다른 gem인 activeadmin-mongoid
(https://github.com/activeadmin/activeadmin-mongoid)이 있다.activeadmin mongoid 뒷이야기
ActiveAdmin은 Mongoid 지원을 핵심 ActiveAdmin 응용 프로그램에 도입하는 것을 미루고 있습니다.아마도 앞으로 activeadmin은 그gem을 통해 NosQL을 지원할 것입니다.
이gem의 리포는 Elia Schito 이전 작업에서 Active Admin 조직으로 끌어들인 것이다.현재 Grzegorz Jakubiak, Nic Boie, JD Guzman, Elia Schito와 기타 Active Admin, 커뮤니티 구성원들이 유지하고 있다.
activeadmin mongoid에 대한 빠른 기술 일별
Mongoid
을 기반으로 한 Rails 프로젝트는 대부분 그 모델 방법에서 activerecord
을 사용할 필요도 없고 이전할 필요도 없다. 왜냐하면 우리는 SQL 세계의 흔한 생각을 처리하지 않기 때문이다.마찬가지로 gm의
activeadmin-mongoid
도 Rails가 필요한 activerecord
관련 요소를 피했다.창업보드에 어떤 신제품을 내놓을 때 고려해야 할 문제다.(적어도 본문을 작성할 때)질문
activeadmin-mongoid
은 activeadmin
에 의존하고 생성기 호출, 예를 들어 rake activeadmin:install
을 저장하여 초기값 설정 파일을 생성합니다.기본적으로 activeadmin은 설정 파일과db 이전 파일을 생성합니다.우리가 언급한 바와 같이db 이전은 SQL 세계에서 효과적이지만, Mongoid를 고려하면 이 파일은 전혀 필요없고, 사용자가 생성한 후에 삭제할 필요가 없다. 왜냐하면 이것은 의미도 없고, 쓸모가 없기 때문이다.
한 사용자가 이 점을 지적하고 이에 대해 문제를 제기했다.https://github.com/activeadmin/activeadmin-mongoid/issues/137
그래서 좀 궁금해서 이 문제를 해결해 보고 싶어요.라인에서는 거의 토론이 없었다. Nic Boie에 한 관리자가 시도를 했고 그가 시도한 내용과 결과를 추가했다.이것은 내가 이 문제를 해결하는 첫 번째 방향을 확정하는 데 도움을 주었다.닉 덕분에!
해결을 향해 나아가다
이상적인 상황에서 닉 보이의 해결 방안이 이 문제를 해결했다.마이그레이션 파일 생성을 중지합니다.그러나 이 종류를 열고 이 방법을 다시 써서 아무 소용이 없도록 하려고 할 때, 그는 일부 파일을 요구해야 한다. 이 파일들은 Requires에 의존해야 한다. 그 중 하나는
activerecord
관련 파일을 가져왔다.그래서 지금 제 임무는 Nic와 똑같은 일을 하는 것이지만 activerecord
이 어떠한 의존 호출이나 다른 방식으로 필요한 데이터를 얻지 못하게 하는 것입니다.Nic가 제공하는 솔루션입니다.
require 'active_admin/mongoid'
require 'generators/active_admin/install/install_generator.rb'
ActiveAdmin::Generators::InstallGenerator.class_eval do
# Make this a no-op so the AR migrations are not installed when ActiveAdmin-Mongoid is used.
def create_migrations;end
end
activeadmingem 읽기
그래서 저는 activeadmingem을 읽고 Nic가 위에
class_eval
을 사용하여 덮어쓰는 클래스를 확인했습니다.ActiveAdmin::Generators::InstallGenerator
from here helped me 클래스를 배우고 현재 클래스를 이해하려면 activerecord
관련 파일이 필요하지만 이 클래스의 부류는 이런 파일이 필요하지 않습니다.그래서 내가 생각해낸 해결 방안은
ActiveAdmin::Generators::InstallGenerator
의 부류를 다음과 같이 바꾸는 것이다.셀프.계승 방법
루비는
inherited
이라는 클래스에 아주 좋은 갈고리가 있는데, 한 클래스가 다른 클래스에 의해 자신을 파생시키는 데 쓰일 때 이 갈고리를 사용한다.inherited
을 사용하면 파생류의 특정한 방식을 제어할 수 있다.멋있지 않아요?제가 심지어 여기에 트위터를 올렸어요.내가 유일하게 주의해야 할 것은 내가 스스로라고 생각하는 것이다.inherited를 호출하면 하위 클래스가 완전히 정의됩니다.
create_migrations
방법의 정의를 삭제하거나 덮어쓸 수 있습니다.하지만 사실은 스스로가 되어야 한다는 것을 증명한다.inherited를 호출하면 사용자 정의 방법이 존재하지 않습니다.자기 뒤에만.계승이 완료되면 클래스는 모든 다른 사용자가 정의한 방법을 실현할 것입니다.😔셀프.메서드
마찬가지로 루비는 예전과 같이
method_added
이라는 갈고리를 제공해 주었고 클래스에 새로운 방법 정의를 추가할 때마다 이 갈고리를 호출했다.지금 어디로 가는지 보이시나요?self.inherited
과 self.method_added
의 장점을 결합할 예정입니다.🤯문제를 해결하다
그래서 우리의 다음 행동은 매우 간단하다.
create_migrations
을 정의합니다.self.method_added
의 정의를 새롭게 정의하고 있다.고전적이죠?😎 ActiveAdmin::Generators::InstallGenerator
이면 우리는 이 하위 클래스의 self.method_added
을 새롭게 정의하여 create_migration
remove_method
은 이 클래스의 방법 정의만 삭제합니다. 따라서 파생 클래스는 현재 create_migration
을 호출할 때 부모 클래스의 정의를 찾을 것입니다.이 동작을 실행할 때 activerecord와 관련된 항목이 필요하지 않습니다.
비밀 번호
Rails::Generators::NamedBase.class_eval do
def create_migrations
end
def self.inherited(klass)
super
if klass.name == "ActiveAdmin::Generators::InstallGenerator"
klass.class_eval do
def self.method_added(method_name)
super
remove_method method_name if method_name == :create_migrations
end
end
end
end
end
이것은 나의 실현이다. PR은 여기(https://github.com/activeadmin/activeadmin-mongoid/pull/164)에 있고 아직 합병되지 않았다.3분의 2의 심사인이 심사에 통과했으니, 나는 그것이 비준과 합병을 얻을 수 있기를 바란다.
Reference
이 문제에 관하여(Ruby Gem 기여 사례 연구: activeadmin mongoid), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nav_devl/case-study-on-ruby-gem-contribution-activeadmin-mongoid-9jg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)