2010-10-12 8 views
48

Encontré algunas preguntas sobre SO sobre las asociaciones de Rails que son algo así como mi pregunta, pero por mi vida no puedo entender cómo usar belongs_to modelos múltiples.Rails pertenece a muchos modelos

Aquí está la estructura de la tabla tengo la intención de tener:

User 
id 

Post 
id 
user_id #foreign key; a post belongs to a User aka "Who created this post" 

Comment 
id 
user_id #foreign key; a comment belongs to a User aka "Who made this comment" 
post_id #foreign key; a comment belongs to a Post aka "What post this comment is for" 

Y las asociaciones :

User 
has_many :posts 
has_many :comments 

Post 
belongs_to :user 
has_many :comments 

Comment 
belongs_to :user 
belongs_to :post 

Es este el enfoque correcto?

+0

¿Cómo se puede realizar un ahorro en los comentarios? –

+0

omg, han pasado 7 años desde que aprendí los rieles (¡gracias, ASÍ!). Para responder a su pregunta @MosesNdeda, usted creará una instancia de un Comentario, asignará al usuario y publicará objetos, y luego llamará 'save' al objeto Comment. – Zabba

Respuesta

52

Sí, ese es el enfoque correcto.

+0

¿Esto requiere una mesa de combinación o algo así ... o funcionaría como se esperaba con solo lo que ha mostrado? – Andrew

+4

Estas son relaciones de uno a muchos (un usuario tiene muchos mensajes, etc.), por lo tanto, no. La tabla de comentarios debería tener el siguiente aspecto: id user_id post_id y ofc content o lo que sea. – Maxem

+0

puedes escribir has_many: posts,: comments – Vasseurth

8

Aunque no siempre es el "mejor" enfoque, los rieles ofrecen lo que se conoce como una asociación polimórfica belongs_to. Le impide definir una clave externa en la base de datos porque la columna xxx_id está haciendo referencia a una identificación en una de muchas tablas posibles, mientras que otra columna designa el nombre del modelo de esa tabla, pero hace que la relación sea más explícita en los raíles. Además, restringe el modelo para que solo pertenezca a uno de los otros modelos, en lugar de pertenecer a uno o más, como sucedería utilizando la configuración de varias claves externas sin alguna magia db adicional.

Cuestiones relacionadas