Rails创建通过关联&集合与数组

时间:2015-11-18 21:51:43

标签: ruby-on-rails arrays collections

我对Active Records中的一些协会概念感到困惑。

我有三种型号User,Bank和Bankaccount。用户和银行模型“has_many”Bankaccounts和Bankaccount模型“belongs_to”用户和银行模型。我使用以下语法通过与User

的关联来创建Bankaccount
@bankaccount = @user.bankaccounts.create(bankaccount_params)

如果我想通过与User的关联以及与Bank的关联来创建bankaccount对象,那么适当的语法是什么?

我的第二个问题与此问题有关。现在,因为我不确定如何通过两个关联创建银行帐户,我通过手动设置参数来处理与银行的关联

  bank_id = params[:bank_id]

然而,当我想要遍历所有银行账户并检索相关银行的名称时,这似乎会引发一些问题。

在我看来,我有

<% @bankaccounts.each do |bankaccount| %>
<%= bankaccount.bank %>

我获得了这些

的清单
#<Bank:0x007f7a66618ef0>
#<Bank:0x007f7a664c9ab8>

如果我试图获取银行名称

<% @bankaccounts.each do |bankaccount| %>
<%= bankaccount.bank.name %>

我为nil类获取了一个未定义的方法名称。我确实在控制台中使用这些简单的行获取了银行的名称

bankaccount = Bankaccount.find(1)
bankaccount.bank.name

你能否给我更多关于这些概念的背景知识,并为我提供适当的语法来循环我的集合@ user.bankaccount,并为每个bankaccount检索相关银行的名称?

感谢。

1 个答案:

答案 0 :(得分:0)

您必须选择一个关联来创建银行帐户,然后分别设置第二个:

@bankaccount = @user.bankaccounts.new(bankaccount_params)
@bankaccount.bank = somebank
@bankaccount.save

或者

@bankaccount = @bank.bankaccounts.new(bankaccount_params)
@bankaccount.user = someuser
@bankaccount.save

此外,我不明白为什么用param手动设置第二个关联会导致你遇到的其他问题。这应该没问题(假设实际存在具有此ID的银行):

@bankaccount.bank_id = params[:bank_id]

如果您选择将外键指定为参数,则可以将其转换为强参数,并将其传递到bankaccount模型中。例如:

def bankaccount_params
  params.require(:bankaccount).permit(:bank_id, ...)
end

关于数组与集合的最后一个问题取决于您要执行的操作。首先,如果您对bankaccount的银行名称特别感兴趣,请更容易获得:

class Bankaccount
  belongs_to :bank
  ...
  def bank_name
    bank.name
  end
end

对于那些购买此类东西的人来说,这也会妨碍Demeter法的违规行为。

如果您只是想在视图中列出@bankaccounts的银行名称,请尝试使用以下内容来利用Rails部分:

应用程序/视图/ bankaccounts / index.html.erb

<%= render @bankaccounts %>

应用程序/视图/ bankaccounts / _bankaccount.html.erb

<%= bankaccount.bank_name %>

有关此内容的更多信息:http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials

如果您因为其他原因而在@bankaccounts上循环,那么您提供的代码应该有效,因为@bankaccounts代表ActiveRecord关系而不是简单数组:

<% @bankaccounts.each do |bankaccount| %>
  <%= bankaccount.bank_name %>
<% end %>   

由于您收到了未定义的方法错误,因此您的问题可能源于您构建@bankaccounts的方式。如果你正在这样做......

@bankaccounts = @user.bankaccounts

...并且您已经验证控制台中的所有内容都已正确关联,那么您的问题可能与数组或集合无关。