所以我有一个Node
,Video
,FamilyTree
和User
。
当您以current_user
身份登录时,他们可以上传视频。每当上传video
时,它就会变为current_user node
上的family_tree
。
主要关联是:Video has_one Node
。
这有效:
@video.create_node(name: @video.title, family_tree_id: @family_tree.id, user_id: current_user.id)
但是,根据Rails指南,我应该能够做到这样的事情:
@video.create_node(@family_tree.attributes)
这不完全正常,因为它将family_tree.name
分配给node.name
这是不正确的(正如您从上面的正确示例中可以看到的那样)。
我试过这样的事情:
@video.create_node(@video.attributes, @family_tree.attributes, current_user.attributes)
但那没用。
如何以更优雅的Rails方式执行此操作?
答案 0 :(得分:2)
除了按名称而不是密钥(user
vs user_id
等)传递关联之外,这已经和你一样有点困难了。
Rails有它的魔力,但我认为没有任何关于用你的例子中的另一个属性创建一个记录的东西。
最终结果如下:
@video.create_node(
name: @video.title,
family_tree: @family_tree,
user: current_user
)
答案 1 :(得分:1)
@numbers ...是正确的,您必须为特定属性命名,以便rails知道您的意思。所以你的第一个例子是正确的,第二个例子是有缺陷的。
但是还有另一个选项,你可以创建另一个叫做(例如)create_node_on_video的方法,同时接受两个模型视频和族树,并在这个辅助方法中挑选并使用create_node保存所需的元素。
def create_node_on_video
return if @video.nil? or @family-tree.nil?
@video.create_node(name: @video.title, family_tree_id: @family_tree.id, user_id: current_user.id)
end