Rails - has_many:through - 以一种形式创建新记录和关联

时间:2014-02-03 19:20:52

标签: ruby-on-rails-4 nested-forms has-many-through form-for fields-for

我目前正在与has_many:在我的项目中通过关联进行斗争。该协会的基础知识如下:

class Course < ActiveRecord::Base
    has_many :contents
    has_many :topics, :through => :contents
end

class Topic < ActiveRecord::Base
    has_many :contents
    has_many :courses, :through => :contents
end

class Content < ActiveRecord::Base
    belongs_to :courses
    belongs_to :topics
end

可能不是更基本的..

因此,想法是用户可以创建许多课程,还可以创建许多主题。主题通过Content类与课程相关联。这样做意味着用户可以创建许多主题并将它们与许多课程相关联。很棒,当课程主题重叠时,可以保存用户再次输入该批次。这一切都很好,花花公子。

但是,我希望用户首先创建一个课程,然后从那里为该课程创建一些新主题。对我来说似乎很合乎逻辑。

我的问题是我正在努力探索最好的方法吗?

我可以废弃:通过关联并有一个基本主题belongs_to课程关联,因为这会做我想要的,但代价是我想要的额外功能。

我正在考虑使用fields_for内容的form_for主题?我不禁想到这是一个共同的问题,有一个共同的答案,但无法在互联网上找到答案。也许是我的措辞。希望这对某人完全有意义......?

提前致谢

1 个答案:

答案 0 :(得分:3)

我会从一个普遍的角度来写这个(但是使用你描述的模型),因为它不仅与你描述的情况有关,而且与你在许多人中创建一个新关联的任何时候相关。使用has_many :through进行多对多关系。

在rails中,这是一个创建新Topic对象的简单示例,该对象与course关联:

@course.topics << Topic.new(params[:topic])

以上假设您之前已经加载了Course对象并将其存储在@course中。它还假设Topic数据来自表单,并存储在:topic键下的参数映射中。

如果您在执行此部分时检查日志,因为您正确设置了关联,您应该看到两个插入语句:INSERT INTO "topics"...INSERT INTO "contents"...

还有其他方法(有些方法比其他方式更为迂回),但我相信这是最直接的。

如果这有意义,请告诉我。