问题
I have a Department
parent model that is associated with a Product
and Document
model through a has_many
/ belongs_to
relationship. The Product
and Document
models are then associated to each other through a has_many :through
relationship via a ProductDocuments
join model.
As part of the associations there is a requirement that the Product
and Document
models have the same Department
parent model when being associated to each other.
Right now I'm doing the following:
ProductDocumentsController < ApplicationController
...
def create
@product = Product.find(params[:product_document][:product_id])
@document = Document.find(params[:product_document][:document_id])
if @product.department.id == @document.department.id
...
end
end
...
end
This works, however it feels inefficient as it introduces two addition database calls in the controller.
Does anyone know of a way that this can be accomplished in a more efficient way, perhaps through a validation in the model?
Any help would be greatly appreciated; thank you!
回答1:
Here are my thoughts. Get pencil, paper and draw with me =). I've ended up with something like this.
Department * * * Product
* *
* *
* *
Document * * * ProductDocument
And that is something called circular reference. Typically it leads to cases like yours - complex validations of field equality among possibly infinite number of tables. So, how do we fix it?
Couple of variants:
- Simply break one of the links. For example,
Document
will reference toProduct
alone. - Remove references to
Department
from bothProduct
andDocument
, and put it somewhere else. For example, intoProductDocument
(however, it's going to be renamed to something more appropriate since it will join three models).
That's all I can say for now.
来源:https://stackoverflow.com/questions/21736409/ensure-parent-models-are-the-same-for-a-has-many-through-association-in-rails-3