创建记录时在另一个表中插入预先确定的数据

时间:2018-09-12 15:15:23

标签: ruby-on-rails

您好,这里是Real Rails新秀。我正在尝试编写一个基本的客户mgmt系统,当我创建一个新客户(客户表)时,我还需要它在另一个表(customer_ownership)中创建带有某些预定信息的10个子记录,然后当我们对它们进行更新/修改时,与客户交谈。

我确实为此感到困惑,是我尝试从创建客户控制器中调用sub_record创建控制器,还是在客户控制器中编写新的控制器动作。

预先感谢

1 个答案:

答案 0 :(得分:0)

我认为您想要做的是使用活动记录回调来执行您需要完成的与数据创建相关的工作。

或使用服务对象设计模式执行所有操作。

或者您也可以将创建后要完成的任务的代码添加为方法,然后直接调用该方法,而不用回调来调用它。

或者此功能可以存在于模型中。根据与您交谈的人的不同,所有这些选项都可以被视为“铁路方式”。

我首选的方法是...

foos

controllers/my_object_contoller.rb

也请查看ActiveRecord associations

因为有多种方法可以创建两个数据模型,这些数据模型使用DB列上的foreign_key ID进行编程链接或相互关联。

Rails为您提供了出色的api,我已将其链接到上面的rails指南。

这种使用活动记录关联的实现可能看起来像这样...

def create
  @object = MyObject.create(my_object_params)
  my_private_method
end

private

def my_private_method
   # create auxiliary data objects here 
end

这为我们提供了一种处理数据的新方法。如果我们创建一个新用户,并且我们要添加的额外数据是用户地址。然后,我们可以以表单的形式收集所有这些数据,然后使用包括has_one帮助程序提供给我们的方法。例如...

# 'app/models/user.rb    

class User < ActiveRecord::Base
  has_one :address
  ...
end

# 'app/models/address.rb'

class Address < ActiveRecord::Base
  belongs_to :user
  ...
end

# 'db/migrate/<timestamp>_create_users.rb'

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string     :email
      t.string     :first_name
      t.string     :last_name

      t.timestamps
    end
  end
end

# 'db/migrate/<timestamp>_create_addresses.rb'

class CreateAddresses < ActiveRecord::Migration[5.2]
  def change
    create_table :addresses do |t|
      t.references :user,         null: false, foreign_key: true
      t.string     :house_number, null: false
      t.string     :streen_name
      t.string     :city
      t.string     :state
      t.string     :zip_code

      t.timestamps
    end
  end
end

当然这都是伪代码,所以您应该真正进入我上面放置的活动记录关联链接