添加到Rails中的连接表

时间:2013-12-21 22:32:07

标签: ruby-on-rails ruby database join

所以我有四个数据库表。

用户(:名称等..)食谱(:name,:description,:user_id等..),Scrapbooks(:name,:description,:user_id)和Scrapbook_Entry(:user_id,recipe_id,:scrapbook_id)

我可以很好地填充用户,食谱和剪贴簿表,但我现在想要做的是将食谱保存到剪贴簿中。通过这样做,我需要填充我为其制作模型的Scrapbook_Entry表。

Scrapbook_Entry模型:

has_one :recipe
has_one :scrapbook 

食谱模型:

has_many :scrapbooks, through: :scrapbook_entries

剪贴簿模型

has_many :recipes, through: :scrapbook_entries

用户模型

has_many :recipes, dependent: :destroy
has_many :scrapbooks, dependent: :destroy

我想在配方视图中创建一个表单,允许我选择一个剪贴簿来保存配方,然后提交并填充Scrapbook_Entry表。

我的问题是:我是否需要为scrapbook_entries创建一个新的控制器并在其中使用create方法或者我是否能够使用配方控制器?如果是,那么如何?< / p>

我是rails的新手,所以仍然想要全力以赴。谢谢!

2 个答案:

答案 0 :(得分:0)

您不需要新的控制器。你应该能够按照

的方式做点什么
@recipe.scrapbook_entries.build(scrapbook: @scrapbook)

假设您的@recipe变量中包含Recipe个对象,并且@scrapbook变量中包含Scrapbook个对象。

答案 1 :(得分:0)

这听起来像是accepts_nested_attributes_for

的工作

它的工作方式是它采用“嵌套模型”(在您的情况下为ScrapBookEntry),并允许您从父模型(Recipe)直接向其发送数据。它有一个学习曲线,但非常有用,特别是当你开始处理大量模块化数据时


接受

的嵌套属性

有一个great RailsCast on this subject here

enter image description here

它的工作原理是通过父模型的控制器为嵌套模型构建一个ActiveRecord对象,从而允许Rails在提交表单时填充两个对象。这意味着您可以在保持代码效率的同时,为嵌套模型添加尽可能多的数据


您的代码

您应该能够处理Recipes控制器中的所有处理,而不是创建新的控制器,如下所示:

#app/models/recipe.rb
Class Recipe < ActiveRecord::Base
    accepts_nested_attributes_for :scrapbook_entries
end

#app/controllers/recipes_controller.rb
def new
    @recipe = Recipe.new
    @recipe.scrapbook_entries.build #-> repeat for number of fields you want
end

def create
    @recipe = Recipe.new(recipe_params)
    @recipe.save
end

private
def recipe_params
    params.require(:recipe).permit(:recipe, :params, scrapbook_entries_attributes: [:extra, :data, :you, :want, :to, :save])
end

#app/views/recipes/new.html.erb
<%= form_for @recipe do |f| %>
    <%= f.text_field :example_field %>
    <%= f.fields_for :scrapbook_entries do |s| %>
         <%= f.text_field :extra_data %>
    <% end %>
<% end %>