【问题标题】:Rails - has_many :through - Create new record and association in one formRails - has_many :through - 以一种形式创建新记录和关联
【发布时间】:2014-02-27 10:33:37
【问题描述】:

我目前在我的项目中与 has_many :through 关联而苦苦挣扎。协会的基本情况如下:

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 类与课程相关联。这样做意味着用户可以创建许多主题并将它们与许多课程相关联。太好了,当课程主题重叠时,可以节省用户再次输入大量内容。这一切都很好,花花公子。

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

我的问题是我正在努力寻找最好的方法来做到这一点?

我可以取消 :through 关联并拥有一个基本主题 belongs_to 课程关联,因为这会做我想要的,但会牺牲我想要的额外功能。

我正在考虑带有 fields_for 内容的 form_for 主题?我不禁认为这是一个常见问题,但在互联网上找不到答案。也许是我的措辞。希望这对某人完全有意义......?

提前致谢

【问题讨论】:

  • 好的,为了澄清,您的意思是您希望能够同时创建一个Course 和一个或多个关联的Topic 对象?
  • 是的,听起来有点像。很抱歉模棱两可,但这真的让我很困惑。所以基本上,在创建课程后,在其显示页面中会有一个类似“添加主题”的链接,该链接将通过创建一个新的Topic 并在contents 中创建记录以建立关联。与课程相关的主题将显示在课程show 页面上的列表中。很像基本的belongs_to 关联,但带有装饰。希望这是有道理的。 Rails 新手,但学得很快。
  • 主要目的是让Topic 与多个Course 相关联,但能够像属于Course 一样构建。我认为这是有道理的......
  • 哦,好吧,那么为特定课程创建一个新的Topic 是在一个单独的页面上(课程的显示页面)。意思是,它不是在创建 Course 的同一时刻创建的。好吧,事实上,这很容易。答案即将...

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


【解决方案1】:

我将从一般的角度来写这篇文章(但使用您描述的模型),因为它不仅与您描述的情况相关,而且与您在 Many- 中创建新关联的任何时间相关。使用has_many :through的多对多关系。

在rails中,这里有一个简单的例子来创建一个新的Topic对象,它与course相关联:

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

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

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

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

让我知道这是否有意义。

【讨论】:

  • 太棒了!谢谢你,Teeg。我会玩这个,看看结果如何。有兴趣查看与您指定的代码相关的任何教程或 API,以便我更好地理解。有点不确定我现在把这段代码放在哪里,但希望一切都会变得清晰。谢谢
  • @user3267045 这段代码将进入你的控制器,无论采取什么行动来响应创建一个新的Topic。我保持这样的准系统是因为我不想对您的系统的外观/工作方式做出任何假设(并且有可能导致混乱)。如果没有看到创建新 Topic 的表单应该如何工作,也很难说更多。如果您想发布(或您的想法),我可以尝试看看。
  • 谢谢,提格。我现在有一些工作。看起来与我之前看到的创建方法有点不同,例如@topic = @course.toics.new(topic_params)if @topic.save 等,只是您指定的代码而不检查.save。听起来对吗?工作正常,所以我很高兴。
  • @user3267045 是的,这看起来也是正确的!我认为我的做法与您刚刚向我展示的内容(如果有,它的分钟)之间没有任何显着差异。如果你没有观察到任何不良影响,你就可以走了。祝你好运,如果你不介意(除非你需要别的东西),如果你觉得这个答案对你有帮助,你想投票并接受(左边的绿色复选标记)吗?
  • 答案已接受 :) 恐怕不能投票,因为我是个大菜鸟!需要 15 声望。当我更受人尊敬时,我会回来做的!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多