【问题标题】:Rails 4 issue in includes and fetch associated itemsRails 4 问题包含并获取相关项目
【发布时间】:2015-08-20 09:04:12
【问题描述】:

我对 Rails 中的 includes 方法有疑问。 我有这个用户模型:

class User < ActiveRecord::Base
  has_one :account
end

还有这个账户模型:

 class Account < ActiveRecord::Base
      belongs_to :User
    end

现在用户模型有:id:names 账户模型有:user_id:country

在另一个控制器中,我想获取并显示所有用户名及其国家/地区。

我正在使用这个查询

@users = User.includes(:account).where(some condition)

请告诉我,我可以在查询中添加什么来获取与用户名关联的所有国家/地区? 提前致谢

【问题讨论】:

  • @users = User.includes(:account) 然后@names = @users.collect(&amp;:name)
  • 我想这样展示它@user.each do |f| f.names f.account.country end

标签: ruby-on-rails ruby-on-rails-4 associations has-one


【解决方案1】:

当您获取记录列表时,控制器中的用户应该是复数。像这样

 @users = User.includes(:account)

鉴于您可以做到这一点。

<% @users.each do |user| %>
  <%= user.names %>
  <%= user.account.country %>
<% end %>

names是用户属性,可以直接获取,而国家是account's属性,可以使用user.account.country获取

【讨论】:

  • 我得到未定义的方法“帐户”
  • 能否请您分享确切的错误。您是否可以为任何用户获取帐户。并且所有用户都有帐户。?
  • NoMethodError (undefined method `account' for #<0x0000000438e628>
【解决方案2】:

如果它给你这样的错误 NoMethodError(未定义的方法“帐户”用于#) 那么这意味着您正在将其转换为控制器本身的数组。

更改您的代码 例如:

@users = User.includes(:account).where('id < 5')

在视图中

<% @users.each do |user| %>
  <%= user.name %>
  <%= user.account.country %>
<% end %>

【讨论】:

  • 如果 country 字段的任何记录为 null 会发生什么...它还会检索进一步的记录吗?
  • 如果国家/地区为零,则没有问题,但如果帐户未关联,则会抛出错误
  • 如果帐户不存在 - user.account.country 除非 user.account.nil?或 user.account.nil? ? 'NA' : user.account.country.nil? ? 'NA' : user.account.country
【解决方案3】:

每当我们使用包含时,默认情况下都会进行外部连接,因此可能会有没有任何帐户的用户,并且您在尝试访问 user.account.country 时会出错,因为 user.account 是 nil 和 on nil 对象会尝试调用不存在的 country 方法。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多