在Ruby on Rails中加入查询

时间:2018-05-18 13:49:25

标签: ruby-on-rails

您好我正在尝试在rails中运行联接查询。我正在尝试从我的用户模型输出特定数据,同时从我的contactDetails模型中获取数据。代码:

User.where(user_type: :lender).all.each do |user|
      result <<
          "#{user.id}, " +
          "#{user.contact_details},"
    end

以上打印得很好,但是当我添加:

User.where(user_type: :lender).all.each do |user|
      result <<
          "#{user.id}, " +
          "#{user.contact_details}," +
          "#{user.contact_details.city}," +
          "#{user.contact_details.region}, " 
    end

找不到地区或城市。

2 个答案:

答案 0 :(得分:1)

我认为正在发生的事情user.contact_details正在返回nil

这将允许第一次插值工作,因为"#{nil}"只返回一个空字符串。

但是,在第二个示例中,当您致电user.contact_details.cityuser.contact_details.region时,您正在调用city上的方法regionnil,因此错误。

您可以使用安全操作符来解释这一点,以返回空字符串,即

user.contact_details&.city
# or in older Ruby versions
user.contact_details.try(:city)

是否要在关联存在时返回空字符串取决于您,但是,如果您不希望它们添加,则可以执行以下操作:

result_string = user.id.to_s

if user.contact_details.present?
  result_string += "#{user.contact_details}," +
                   "#{user.contact_details.city}," +
                   "#{user.contact_details.region}, "
end

result << result_string

最后,如果您希望contact_details出现,问题可能在于他们创建并附加到user模型 - 如果是这种情况,我建议您查看你是如何做到这一点的,如果你不能让它发挥作用,用相关信息打开一个新问题。

希望有所帮助 - 如果您对此有任何疑问,请告诉我。

答案 1 :(得分:0)

我用礼物解决了这个问题?方法然后将三元运算符放在代码中,为没有提供联系人详细信息的用户提供无适用的消息。无需添加包含或连接:

User.where(user_type: :lender).all.each do |user|

      result <<
          "#{user.id}, " +
          "#{user.contact_details.present? ? user.contact_details.country : ' N/A '}," +
          "#{user.contact_details.present? ? user.contact_details.region : ' N/A ' }," +
          "#{user.contact_details.present? ? user.contact_details.city : ' N/A '}"
    end