Pergunta

Depois de trabalhar com ASP.Net MVC, ele me tem pensamento sobre Rails. Eu trabalhei com Rails antes, mas estou um pouco enferrujado. ASP.Net MVC tutoriais implementação camada de dados esconderijo recomment com o padrão de repositório. Isso permite que Dependency Injection easiesr para a Unidade de Teste e agradável dissociação entre o controlador da implementação do modelo.

Lembro-me de controladores de Rails usando Active Record objetos diretamente, e testes de unidade usando bancos de dados de teste que pode ser configurado e derrubado com facilidade. Isso resolve a necessidade de trocar para testes de unidade, mas ainda parece uma má idéia ter muito código de ActiveRecord exposta no controlador.

Então, minha pergunta é, o que é o mais recente a melhor prática aqui? São reais (não zombou) ainda bancos de dados usados ??para testes de unidade? desenvolvedores não Rails chamar ActiveRecord diretamente, ou uma abstração?

Foi útil?

Solução

O ActiveRecord mesmo realmente constituem a "camada de dados", eu me pergunto? Afinal, o seu objectivo é abstrato (numa extensão bastante razoável) o armazenamento real interação. Se eu tiver um modelo que herda de ActiveRecord::Base e eu referência a esse modelo em um controlador, estou realmente interagindo com a camada de dados?

Olhando para uma descrição breve da Pattern Repository eu diria que os métodos do find_by_ já estão dando-lhe muito do que ele descreve, que é bom, não é? OK, a camada de abstração é furado (uma força mais generosamente dizer "pragmática") em que podemos ir muito mais perto do metal se for necessário, e find_by_sql por exemplo, será muito bem tornar óbvio que estamos lidando com um relacional banco de dados de algum tipo.

Eu recomendo nunca mais (ou talvez eu devesse dizer "raramente e não sem extrema justificação" - é sempre complicado usando absolutos) colocar o código em controladores que faz com que seja possível inferir a plataforma de dados a ser utilizado. Tudo deve ser empurrado para os modelos - named_scope pode ser muito útil aqui. Para resultados complexos, considerar o uso de objetos "apresentação" como a interface (Struct e minha OpenStruct favorito pessoal pode ser muito útil aqui).

Enquanto ActiveRecord é a de facto standard, dado que instala com Rails, não é o único jogo na cidade. Para bancos de dados não-SQL, algo diferente é necessário, mas mesmo no domínio SQL há Datamapper (é que, com base no homônimo padrão PoEAA ?)

Em Rails 3.0 vai ser muito mais fácil para escolher e escolher os componentes como o ORM como Yehuda e os meninos desfazer e limpar as interfaces.

Outras dicas

Minha experiência tem sido a de que Ruby on Rails integra ActiveRecord com tanta força (na maioria dos casos, pode tornar-se quase completamente transparente) que os desenvolvedores muitas vezes usá-lo sem qualquer abstração.

A única coisa a lembrar é que o padrão de repositório e o padrão Active Record foram ambos sugerido em Padrões de Enterprise Architecture por Martin Fowler (que, se você não leu ainda ... você deve). Active Record é totalmente integrado no Rails. Microsoft .NET doens't amarrá-lo a um padrão ... então o padrão Repository foi adotada pela maioria dos desenvolvedores.

Você pode fazê-lo de qualquer maneira. Na maioria das vezes, o Rails testes funcionais são escritos para percorrer todo o caminho para o banco de dados, onde os dados são preenchidos a partir de dispositivos elétricos, como você descreve.

Mas não é incomum para zombar as chamadas camada de serviço, por exemplo:

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

... ou algo parecido. Na verdade, eu faço isso o tempo todo ter o controle do objeto modelo (ou zombar isso também).

folllowing Rails convenções sempre leva para baixo o caminho de menor memórias dolorosas, por isso é aconselhável.

Dependendo da sua definição de "real" ... Para a unidade de teste que eu vi que as pessoas tendem a usar o mesmo esquema de dados como seu site principal, e semear o banco de dados antes que os testes são RAN / durante os testes (por usando Factory Girl, Machinist ou ol luminárias simples') e, em seguida, os testes são correu com base nesses dados.

Rails desenvolvedores chamam ActiveRecord diretamente sobre esses dados, como no mundo real.

Controllers são supostamente para modelos de acesso no MVC. Rails é tudo sobre como evitar alguns dos abstrações inúteis que caracterizam o mundo empresarial.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top