13

ASP.Net MVC로 작업 한 후에 레일즈에 대해 생각하고 있습니다. 이전에 레일스와 함께 작업했지만 약간 녹슬 었습니다. 저장소 패턴으로 숨겨진 데이터 계층 구현을 ASP.Net MVC 자습서 recomment. 이것은 단위 테스트를위한 easiesr Dependency Injection과 모델 구현으로부터의 컨트롤러의 훌륭한 분리를 가능하게합니다.저장소 패턴이있는 Ruby on Rails?

레일즈의 컨트롤러는 액티브 레코드 개체를 직접 사용하고 테스트 데이터베이스를 사용하여 단위 테스트를 설정하고 손쉽게 분해 할 수 있음을 기억합니다. 이는 단위 테스트를 위해 교체해야 할 필요성을 해결하지만 컨트롤러에 많은 ActiveRecord 코드가 노출되는 것은 여전히 ​​바람직하지 않은 것처럼 보입니다.

제 질문은 여기에 최신 베스트 프랙티스가 무엇입니까? 실제 (조롱되지 않은) 데이터베이스는 여전히 단위 테스트에 사용됩니까? Rails 개발자는 ActiveRecord를 직접 호출하거나 추상화를 호출합니까?

답변

7

ActiveRecord는 실제로 "데이터 레이어"를 구성합니까? 결국,이 도구의 목적은 실제 상호 작용 저장소를 추상화 (상당히 합리적인 범위 내에서)하는 것입니다. ActiveRecord::Base에서 상속받은 모델을 컨트롤러에서 참조하면 데이터 레이어와 실제로 상호 작용할 수 있습니까?

Repository Pattern에 대한 간략한 설명을 보면 find_by_의 방법이 이미 설명하는 내용의 대부분을 제공하고 있다고 말할 수 있습니다. 좋아요, 추상화 레이어가 새어 나옵니다 (좀 더 관대하게 "실용적"이라고 말할 수 있습니다). 필요하다면 우리는 금속에 더 가깝게 갈 수 있습니다. 예를 들어 find_by_sql은 우리가 관계형 어떤 종류의 데이터베이스.

저는 데이터 플랫폼을 추측 할 수있게 해주는 코드를 컨트롤러에 두는 것을 절대로 (극단적 인 정당화 없이는 거의 사용하지 말라는 말을해야합니다). 모두 모델에 푸시되어야합니다. named_scope은 매우 유용 할 수 있습니다. 복잡한 결과를 얻으려면 "프리젠 테이션"객체를 인터페이스로 사용하는 것이 좋습니다 (Struct 및 내 개인 즐겨 찾기 OpenStruct는 여기에서 매우 유용 할 수 있음).

ActiveRecord는 사실상 표준이지만 Rails와 함께 설치되면이 게임이 유일한 게임이 아닙니다. 비 SQL 데이터베이스의 경우, 다른 무언가가 필요하지만, 심지어 SQL 영역에서 Datamapper을합니다 (eponymous PoEAA pattern 기준이 오니?) 레일 3.0에서

이 같은 Yehuda와 ORM으로 pick and choose components에 훨씬 쉽게 될 것있다 소년들은 인터페이스를 풀고 정리합니다.

+0

예 1000x는 데이터 계층을 구성합니다. 벤더 특정 SQL 문자열을 사용하는 것과는 완전히 밀접한 결합은 아니지만 AR 클래스는 대 부분의 경우 데이터베이스 테이블과 1을 1로 매핑합니다. 이것은 (일반적으로 레일의 경우에 해당됩니다) 비즈니스 오브젝트와 db 테이블간에 차이가없는 프로그래밍 스타일을 장려합니다. RP는 이러한 구분을 위해 특별히 고안되었습니다. – Jonah

9

내 경험에 비추어 볼 때 Ruby on Rails는 ActiveRecord를 매우 강하게 통합하여 (대부분의 경우 거의 투명해질 수 있음) 개발자가 추상화없이 자주 사용합니다.

기억해야 할 점은 저장소 패턴과 활성 레코드 패턴이 모두 Patterns of Enterprise Architecture by Martin Fowler에 제안되어 있다는 것입니다 (아직 읽지 않았다면 ...). Active Record는 Rails에 긴밀하게 통합되어 있습니다. Microsoft .NET은 당신을 패턴에 묶지 않습니다 ... 그래서 저장소 패턴이 대다수의 개발자에 의해 채택되었습니다.

+0

ActiveRecord를 원하지 않는다고 생각하면 Rails가 나를위한 도구가 아닙니다. – SystematicFrank

+0

@ SystematicFrank 당신은 ActiveRecord, Ruby gem 또는 ActiveRecord 패턴을 의미합니까? 대부분의 프레임 워크에는 ActiveRecord가 함께 제공되며 긴밀하게 통합되어 있습니다. – iGbanam

0

Folllowing Rails 대회는 항상 가장 고통스러운 추억의 길을 인도합니다. 따라서 조언을받습니다.

"실제"에 대한 정의에 따라 ... 단위 테스트의 경우 사람들이 주 사이트와 동일한 데이터 스키마를 사용하는 경향이 있으며 테스트를 실행하기 전에/테스트 중에 데이터베이스를 시드하는 경향이 있습니다 (Factory Girl, Machinist 또는 plain ol fixtures를 사용하여 테스트 한 후 해당 데이터를 기반으로 테스트를 수행합니다.

레일 개발자는 실제 세계 에서처럼이 데이터에서 직접 ActiveRecord를 호출합니다.

0

컨트롤러는 MVC의 모델에 액세스해야합니다. Rails는 엔터프라이즈 세계를 특징 짓는 불필요한 추상화를 피하는 것입니다.

+0

레일스는 MVC가 아니고 레일스는 모델 2입니다. – siefca

+0

"모델 2는 콘텐츠를 얻고 조작하는 데 사용되는 로직과 콘텐츠 디스플레이를 구분하는 ** Java ** 웹 애플리케이션 디자인에 사용되는 복잡한 디자인 패턴입니다." http://en.wikipedia.org/wiki/Model_2 –

+0

RoR은 MVC보다 Model 2에 더 가깝습니다. – siefca

2

어느 쪽이든 할 수 있습니다. 대부분 레일스 기능 테스트는 설명대로 데이터가 데이터베이스에서 채워지는 곳까지 작성되도록 작성되었습니다.

그러나 예를 들어, 서비스 계층의 호출을 조롱하지 드문 일이다 : 그런

User.expects(:find_by_id).with("1").returns(u); 
get :show, :id=>"1" 

... 또는 뭔가. 사실, 나는 이것을 항상 모델 객체 (또는 모의 객체)의 제어를 가지고있다.