2012-04-26 7 views
5

En un proyecto bastante grande encontré un problema de anidación de modelo profundo. Por ejemplo, existe un modelo como este:Anidamiento de modelo profundo en Ruby on Rails

class Communication::Conversation::ForProposal < Communication::Conversation::Base 
    ... 
end 

y, además, cada vez que tenemos que especificar TABLE_NAME class_name, FOREIGN_KEYS y así sucesivamente.

¿Qué alternativas conoce y cómo en realidad deberían nombrarse sus modelos de opinión?

+1

Modelos no de espacios de nombres. –

+0

@Beerlington en absoluto? A veces tiene sentido. Por ejemplo, si tiene algún subsistema en el proyecto que consiste en varios modelos trabajando en conjunto. –

+0

Tuve un diálogo con mis amigos, así que llegamos a la conclusión de que anidar es genial para los modelos de STI y para los controladores, para separar las partes de Admin :: y de los usuarios. ¿Algo más? – makaroni4

Respuesta

0

Debería considerar el uso de mixins. Te ayuda a organizar tu código por funcionalidades, que te llevan a un código más limpio. La siguiente página lo explica bien.

http://juixe.com/techknow/index.php/2006/06/15/mixins-in-ruby/

he estado buscando en algún código fuente de Rails en GitHub, y es muy limpio. Utilizan mucho mixins.

https://github.com/rails/rails/tree/master/activemodel/lib

+0

El uso de mixins no agrupa los modelos juntos. Tengo conexiones adicionales a otras bases de datos (aunque esta es una medida transitoria) y algunas de las bases de datos tienen los mismos nombres de tabla, por lo que el espacio de nombres también difunde colisiones de nombres, por lo que las mixins no son de ayuda. –

+0

Veo en la documentación de la utilidad REXML un ejemplo de hacer una inclusión de REXML y luego no tener que calificar el espacio de nombres. http://www.germane-software.com/software/rexml/docs/tutorial.html –

0

En las últimas versiones de los carriles se puede namespace sus modelos poniéndolos en un directorio bajo app/models. Puede probar la aplicación/modelos/comunicación/conversación para esos modelos.

+0

Eso no soluciona el problema de tener que especificar el espacio de nombres cuando se usan los modelos. –

+0

No tengo claro dónde lo haces y no quiero especificar los espacios de nombres. Si es al escribir cada uno de ellos y hablar sobre los demás, puede envolver las cosas en un módulo para mayor claridad. Eso debería hacer que cualquier referencia a clases dentro del módulo no requiera el prefijo. Si está tratando de reducir la necesidad de especificar el espacio de nombres fuera del módulo, entonces necesita algo como 'include ModuleName', pero creo que cargará todo el módulo en la clase actual. – LordJavac