【问题标题】:Add to join table in Rails添加到 Rails 中的连接表
【发布时间】:2013-12-21 22:32:06
【问题描述】:

所以我有四个数据库表。

用户(:name 等)食谱(: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 表。

我的问题是:我是否需要为我的剪贴簿条目创建一个新的控制器并在其中有一个创建方法,或者我是否能够使用食谱控制器,如果是这样,怎么做?

我是 Rails 新手,所以仍在努力解决所有问题。谢谢!

【问题讨论】:

  • 您并没有真正告诉我们您遇到了什么问题。只有你拥有的和你想做的。
  • 抱歉!是不是更具体一点?添加了一个编辑。

标签: ruby-on-rails ruby database join


【解决方案1】:

您不需要新的控制器。您应该能够按照以下方式做一些事情

@recipe.scrapbook_entries.build(scrapbook: @scrapbook)

假设您有一个 @recipe 变量,其中包含一个 Recipe 对象,以及一个 @scrapbook 变量,其中包含一个 Scrapbook 对象。

【讨论】:

  • 这会放在 create 方法中的 recipes 控制器中吗?
  • 如果您在创建食谱后立即链接它,是的。但是,它不一定必须。
  • 啊,是的。道歉。食谱和剪贴簿已经创建好了。这就是为什么我在挣扎。试图弄清楚如何设置表单,然后将其定向到哪里。我在猜测食谱控制器,但不确定使用什么方法
【解决方案2】:

这听起来像是accepts_nested_attributes_for 的工作

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


接受嵌套属性

有一个great RailsCast on this subject 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 %>

【讨论】:

  • 感谢您提供所有这些信息 Rich。如果配方和剪贴簿数据已经存在并且我只想使用表单用现有数据填充 Scrapbook_entry 表,这是否仍然有效?
  • 当然 - 我们使用类似的东西。我们有一个时事通讯应用程序,您可以在其中创建新消息并添加订阅者。 subs 必须 已经存在,我们只需使用select 表单元素来选择它们
  • 这很好用,因为我建议的方式只将数据发送到连接模型。我们很难弄清楚如何通过连接模型创建新元素,结果证明如果你想让它工作,你必须在连接中嵌入另一个accepts_nested_attributes_for跨度>
  • 您基本上只是用ids 填充模型。您的验证将是前端的,但无论哪种方式,您只需向该模型发送id 用于配方和id 用于剪贴簿;)
猜你喜欢
  • 2016-08-20
  • 2011-01-20
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多