2009-09-20 101 views
0

我有一个图像,belongs_to一个用户和一个二进制文件(物理文件属性存储在一个单独的模型)。在过去(读:昨天),我手动设置的USER_ID值:在Rails中设置关联的ID

@image = Image.new(params[:image]) 
@image.user_id = current_user 

一个朋友最近避让我的事实,我应该用协会代替,所以我的控制器代码变成了:

@image = current_user.image.new(params[:upload]) 

这当然更好,而且效果很好。现在我想为我的二元关联做类似的事情,但我不知道如何。提取和存储我的二进制文件是由一个BinaryObserver类完成的,该类观察Image模型。在观察者的before_validation回调中,上传的文件被发送到Binary类,并且创建/存储二进制对象。一旦存储,我需要为我的图像模型设置binary_id值。我一直在用手动的方式去做,但现在我觉得我应该以另一种方式来做。下面是我在BinaryObserver#before_validation

def before_validation(model) 
    binary   = Binary.new.upload(model.upload) rescue raise 
    binary   = binary.store() 
    model.binary_id = binary.id 
rescue => e 
    # 
    # Rethrow any exception that was raised. 
    # 
    raise 
end 

我应该做这样的其他方式?如果是这样,怎么样?在多关联场景中,我看不到一种方法可以“自动”设置多个外键值。

谢谢。

Rob

回答

0

我想我找到了正确的答案。相反,设置一个变量来保存新创建的Binary实例,我设置的关联本身:这似乎做什么我之后

model.binary = Binary.new.upload(model.upload) rescue raise 

。它自动设置外键值,并允许我直接对相关对象进行操作。

0

你还有一个has_one/belongs_to关系的图像/二进制?这可能是有用的...

+0

我这样做。图像属于二进制和二进制has_one图像。 – 2009-09-21 01:28:13