我对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检索相关银行的名称?
感谢。
答案 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
...并且您已经验证控制台中的所有内容都已正确关联,那么您的问题可能与数组或集合无关。