Rails 5:通过另一个模型更新嵌套属性

时间:2016-09-23 20:17:27

标签: mysql ruby-on-rails

我无法通过第3个模型更新与当前模型相关的嵌套属性。

聚焦模型:简介

class Profile < ApplicationRecord
  belongs_to :user
  has_many :phone_numbers

  ##Set nested attributes
  accepts_nested_attributes_for :phone_numbers, reject_if: :all_blank, allow_destroy: true

Netsted属性:PhoneNumber

class PhoneNumber < ApplicationRecord
  belongs_to :profile
end

第三种模式:用户

class User < ApplicationRecord
  has_one :profile
end

在数据库中,他们的关系是 profile.user_id = user.id,phone_number.user_id = user.id

问题:如何更新个人资料时更新电话号码?

我试过

<%= form_for @profile, url: {action: "update"} do |f| %>
 ...
     <%= f.fields_for :phone_numbers do |ff| %>
       ...

并收到错误消息:

  

Mysql2 ::错误:'where'中的未知列'phone_numbers.profile_id'   子句':SELECT phone_numbers。* FROM phone_numbers WHERE   phone_numbersprofile_id = 1

2 个答案:

答案 0 :(得分:1)

错误非常明确且充满了号召性用语:

  • profile_id列添加到phone_numbers表,以反映ProfilePhoneNumber模型之间的关联。

答案 1 :(得分:1)

要将profile_id列添加到phone_numbers表格,您需要迁移。这是使用rails命令执行的,如下所示:

rails generate migration AddProfileRefToPhoneNumbers  profile:references
rake db:migrate

这将解决您的错误问题。我还可以看到你遇到问题的路线:

class User < ApplicationRecord
  has_one :profile
end
class Profile < ApplicationRecord
  belongs_to :account

您的个人资料为belongs_to帐户,而非用户。您希望将帐户替换为user或将您的外键替换为account_id,并将该行更改为:

  belongs_to :account, class_name: 'User'