ruby-on-rails - 在 Rails 中创建 2 个具有 has_one 关联的对象

标签 ruby-on-rails ruby

我需要获取一些有关在 Rails 中通过验证创建新对象的信息。例如有如下代码:

def create
  @user = User.new(params[:user])
  if @user.save
    # some actions: redirect, render, etc
  else
    render 'new'
  end
end

但是如果有 2 个模型具有 has_one 关联,例如 Club 和 Place。我需要在同一个“创建”操作中从 params 创建这两个对象,因为我有相同的表单来为其输入数据(params[:club]params[:俱乐部][:地点])。我不知道应该如何保存这个对象,因为为了构建一个地方(@club.build_place(params[:club][:place]))我应该将@club保存在数据库中。请给我解决我的问题的代码示例。提前致谢。

最佳答案

如果您要从单个表单创建多个对象,您可能最好将此逻辑放入“表单对象”中...请参阅 CodeClimate 博客中的文章“重构 Fat ActiveRecord 模型的 7 种模式”此处(查找有关提取表单对象的第 3 节):http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models .

Railscasts 也有关于表单对象的精彩剧集,尽管它是“专业剧集”(即需要订阅)。 http://railscasts.com/episodes/416-form-objects

简而言之,您创建一个自定义模型,包括一些必要的 ActiveModel 模块,然后创建一个自定义保存方法,例如(这直接来自文章,其中有很多很好的建议)。

class Signup
  include Virtus

  extend ActiveModel::Naming
  include ActiveModel::Conversion
  include ActiveModel::Validations

  attr_reader :user
  attr_reader :company

  attribute :name, String
  attribute :company_name, String
  attribute :email, String

  validates :email, presence: true
  # … more validations …

  # Forms are never themselves persisted
  def persisted?
    false
  end

  def save
    if valid?
      persist!
      true
    else
      false
    end
  end

private

  def persist!
    @company = Company.create!(name: company_name)
    @user = @company.users.create!(name: name, email: email)
  end
end

这为您提供了更多的控制权和更清晰的界面。

关于ruby-on-rails - 在 Rails 中创建 2 个具有 has_one 关联的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102973/

相关文章:

arrays - Ruby array.each 具有非唯一整数值

ruby-on-rails - 如何在 Ruby 中合并和排序 YML 文件中的键?

mysql - 出于用户授权目的,如何处理数据库中的大量记录存储?

ruby-on-rails - 如何点击没有文字的链接?

mysql - Rails 4 设计名字,姓氏不进入数据库

javascript - jquery 和 ajax 工具提示不适用于实时加载的内容

ruby - rvm use 1.9.2 让我使用 ruby​​ 1.8.7

ruby-on-rails - 如何让 to_json 转义前斜杠

ruby-on-rails - 升级到 Rails 5 问题 - 现有应用程序

ruby - 我如何在 Clojure 中编写 Ruby 的 each_cons?