如何以Rails方式创建具有其他关联的关联?

时间:2015-04-13 23:47:21

标签: ruby-on-rails ruby-on-rails-4

所以我有一个NodeVideoFamilyTreeUser

当您以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方式执行此操作?

2 个答案:

答案 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