【问题标题】:How to retrieve the account id just created with nested methods?如何检索刚刚使用嵌套方法创建的帐户 ID?
【发布时间】:2011-07-18 10:03:19
【问题描述】:

我正在使用 Ruby on Rails 3 并成功使用嵌套模型来保存模型\对象关联。

在我的用户模型文件中:

class User < ActiveRecord::Base
  has_one :account

  accepts_nested_attributes_for :account
  validates_associated :account
end

@user.save 之后我想检索刚刚创建的帐户 ID 并将该值保存在用户数据库表中。我需要它,因为我将使用account_id 作为用户类的外键,但我不知道这是否可能。如果是这样,我该怎么做?


在我的用户模型中,我还尝试了以下方法:

before_create :initialize_user

def initialize_user
  user_account = Account.create
  self.account_id = user_account.id
end

但它不起作用。


更新

我试过了

class User < ActiveRecord::Base
  belongs_to :account,
    :class_name  => "Account",
    :foreign_key => "users_account_id"
end

class Account < ActiveRecord::Base
  has_one :user,
    :class_name  => "User",
    :foreign_key => "users_account_id"
end

并保存新帐户。无论如何,在用户数据库表中,users_account_id 列是null,因此foreign_key 值不会自动保存。

【问题讨论】:

  • @user.account.id 不起作用?
  • 使用 has_... 通常意味着该模型将具有主键。 belongs_to 的任何模型通常都会包含外键。您是否考虑过在帐户模型中执行“belongs_to”来维持关系?
  • @mway 我认为我必须主要在控制器中使用它。也许在模型中我必须使用回调,但是否有可能如果另一个人创建自己的用户,那个人会得到相同的 account.id 值?(!)无论如何,我想找到一些“直接的方式” "。
  • @Will Ayd 哎呀——是的,你完全正确,@user.account.id 可能会执行不必​​要的查找。 @user502052 - 你确定关系保存正确吗? Rails 自动更新中的 IIRC 模型,因此无需实际获取更多信息;它应该是可用的。不过在 v3.x 中可能发生了变化。
  • @mway 说:“你确定这段关系被正确保存了吗?” - 是的,该帐户已正确存储在数据库中。

标签: ruby-on-rails ruby ruby-on-rails-3 methods associations


【解决方案1】:

方法是错误的。当您具有“has_one”关系时,它们的外键位于关联模型中。因此,在您的情况下,它将考虑在内。如果它接受帐户的嵌套属性。如果您正在编写,则默认情况下应注意这一点。

看看http://railscasts.com/episodes/196-nested-model-form-part-1 和其他部分,看看嵌套表单是如何工作的

【讨论】:

  • 我已经看过 railscast 了,但我想在用户模型中有密钥。所以我应该将关联从“has_one”更改为“belogns_to”?
  • @user502052 你确定你不想要一个拥有_many 用户的账户模型和一个属于_to 账户的用户模型吗?
  • 是的,将其更改为belongs_to,当您接受嵌套属性时,它应该只创建帐户本身。您不必单独创建它。
  • @Will Ayd - 不,我想要一个拥有一个帐户和一个帐户属于一个用户的用户。
  • 我更新了你所说的问题,但这种方法也没有达到预期的效果。
【解决方案2】:
def initialize_user
  user_account = Account.create
  self.account_id = user_account.id
end

应该是

def initialize_user
  self.account.create
end

在创建新的 Account 实例时,它将自动使用有关当前用户的信息。您的方法会奏效,但您需要添加一个额外的“保存”调用。

【讨论】:

  • 我还必须为从表格填写的帐户传递参数......所以,如果可能的话,我不会这样做。
  • 你可以为这个“initialize_user”实用函数添加一个额外的参数,或者只是从你的控制器调用类似“@current_user.account.create params[:account_stuff]”的东西。
猜你喜欢
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多