未创建 Rails 关联模型

Posted

技术标签:

【中文标题】未创建 Rails 关联模型【英文标题】:Rails associated model not being created 【发布时间】:2013-10-03 15:43:17 【问题描述】:

我得到了以下关联:

class User < ActiveRecord::Base
  has_and_belongs_to_many :subscribers, :join_table => 'subscribers_users'
end

class Subscriber < ActiveRecord::Base
  has_and_belongs_to_many :devices, :join_table => 'subscribers_devices'
end

class Device < ActiveRecord::Base
  has_and_belongs_to_many :subscribers, :join_table => 'subscribers_devices'
  has_many :device_attributes
end

class DeviceAttribute < ActiveRecord::Base
  belongs_to :device
end

在用户类中,我的创建方法如下所示:

def self.create(params)

  transaction do

    # create user
    user = User.new
    user.assign_attributes params

    # associate a device
    device = Device.build_from_params(params.dup)
    raise_if_invalid device
    subscriber.devices.push device

    # associate device_attributes to device
    params[:buttons].each do |b|
      # >>> problem here >>>
      device.device_attributes.build(:button_id => b[:button_id])
    end

    user.save
  end

end

问题出现在创建设备的 device_attributes 对象的行上。注释此行时,我的用户及其关联对象(订阅者和设备)已正确创建。但是当我取消评论时,我的用户只有一个订阅者,仅此而已。它似乎停止并且不会与 devce_attributes 对象一起创建任何设备!

控制台没有错误..这对我来说真的很奇怪,怎么了?

谢谢!

【问题讨论】:

【参考方案1】:

我相信您需要在循环中创建的每个设备对象上调用savebuild 方法实例化了一个新对象,但实际上并未将其保存到数据库中。详情请见this guide。

device.device_attributes.build(:button_id => b[:button_id]).save()

current_device = device.device_attributes.build(:button_id => b[:button_id])
current_device.save()

应该可以解决问题。

【讨论】:

但这应该是自动的(保存父对象时保存子对象)根据这里:api.rubyonrails.org/classes/ActiveRecord/…,不是吗? 如果您对 User.save 的调用发生在您的循环中,这可能会起作用。因为它没有被调用,所以每个 Device 对象都会超出范围并在循环的每一次传递中死掉。

以上是关于未创建 Rails 关联模型的主要内容,如果未能解决你的问题,请参考以下文章

了解 Rails 控制器 - 通过关联模型的实例变量查看连接

通过Rails中的关联使用has_many创建新模型时出现不允许的参数错误

复杂的 Rails 模型/关联

创建具有不同列名的 Rails 关联

Rails:不使用参数时关联两个不同的模型[:id]

Rails - 如何让两个用户 ID 与模型相关联