在Rails中创建具有has_one关联的2个对象

时间:2013-11-20 17:37:57

标签: 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。我需要在同一个'create'操作中从params创建这两个对象,因为我有相同的表单来输入数据(params[:club]params[:club][:place])。我不知道应该如何保存这些对象,因为为了构建一个地方(@club.build_place(params[:club][:place])),我应该将@club保存在数据库中。请给我举例说明我的问题代码。提前致谢。

1 个答案:

答案 0 :(得分:3)

如果您要从单个表单创建多个对象,最好将此逻辑放入“表单对象”中...请参阅CodeClimate博客中的文章“7个重构Fat ActiveRecord模型的模式”在这里(查找关于提取表单对象的第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

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