我目前正在与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主题?我不禁想到这是一个共同的问题,有一个共同的答案,但无法在互联网上找到答案。也许是我的措辞。希望这对某人完全有意义......?
提前致谢
答案 0 :(得分:3)
我会从一个普遍的角度来写这个(但是使用你描述的模型),因为它不仅与你描述的情况有关,而且与你在许多人中创建一个新关联的任何时候相关。使用has_many :through
进行多对多关系。
在rails中,这是一个创建新Topic
对象的简单示例,该对象与course
关联:
@course.topics << Topic.new(params[:topic])
以上假设您之前已经加载了Course
对象并将其存储在@course
中。它还假设Topic
数据来自表单,并存储在:topic
键下的参数映射中。
如果您在执行此部分时检查日志,因为您正确设置了关联,您应该看到两个插入语句:INSERT INTO "topics"...
和INSERT INTO "contents"...
。
还有其他方法(有些方法比其他方式更为迂回),但我相信这是最直接的。
如果这有意义,请告诉我。