2010-04-09 13 views
8

Hola estoy haciendo un pequeño sitio para ayudarme a mí y mis amigos a aprender idiomas. Uso típico:cómo asocio un modelo dos veces a otro

Adam es inglés pero está aprendiendo japonés. Adam puede practicar su japonés escribiendo y enviando artículos escritos en japonés. Adam cant (no se permite) enviar artículos escritos en su lengua materna. Adam puede leer artículos (escritos en inglés) por otros usuarios que están aprendiendo Inglés

Im tratando de pensar cómo modelar esto y resulta ser más difícil que los rieles estándar, muchos pertenecen a asociaciones que estoy acostumbrado a.

funcionalidad necesidad, yo como

-show all articles written in adams native language 
@adam.native_language.articles 

-show all posts written by users just like adam (i.e. learning the same language) 
@adam.foreign_language.articles 

-perhaps showing all posts written by language learners in one particular language 
@language => Japanese 
@langauge.posts 

Necesito un usuario, el artículo y el modelo de lenguaje. ¿Pero cómo asocio el lenguaje y los modelos de usuario? Se siente como si el lenguaje se asociara dos veces al modelo de usuario, una vez para native_language y una vez para foreign_language.

Respuesta

18

Sí, tienes razón. La asociación entre el usuario y el lenguaje es doble. Es bastante fácil modelar esta situación usando Rails:

class Language < AR::Base 
    has_many :native_speakers, :class_name => "User", :foreign_key => "native_language_id" 
    has_many :second_language_speakers, :class_name => "User", :foreign_key => "second_language_id" 
    has_many :articles 
end 

class User < AR::Base 
    # we expect the users table to have native_language_id and second_language_id columns 
    belongs_to :native_language, :class_name => "Language" 
    belongs_to :second_language, :class_name => "Language" 
    has_many :second_language_articles, :through => :second_language, :source => :articles 
    has_many :native_language_articles, :through => :native_language, :source => :articles 
end 

class Article < AR::Base 
    belongs_to :language 
end 

Algo así debería funcionar.

+0

gracias milán eso es excelente !, ¿cuál es el nombre para este tipo de asociación? – robodisco

+0

Las asociaciones entre el usuario y los artículos generalmente se denominan "has_many: through". –

Cuestiones relacionadas