我在远程lat long上实现了查询,并在查询中创建了虚拟字段
user = User.all
if longitude.present? && latitude.present? && fulladdress.present?
distantQuery = "(3959 * acos( cos( radians("+latitude+") ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians("+longitude+")) + sin( radians("+latitude +")) * sin(radians(latitude)))) < " + miles
user = User.select("*, (3959 * acos(cos(radians("+latitude+")) * cos( radians(latitude)) * cos(radians(longitude) - radians("+longitude+")) + sin(radians(" +latitude +")) * sin(radians(latitude)))) as distant").where(distantQuery)
end
当我的if条件运行时,遥远的其他方面将会出现
<% @result.each do |r| %>
<tr>
<td>
<%= r.distant.present %>
</td>
</tr>
现在在视图中我的遥远是来自形式查询然后它将显示结果,当它不会来时它会显示我错误
undefined method `distant' for #<User:0x000000092a6558>
我在视图中实现了“礼物”
<% if r.distant.present? %>
<%= r.distant.to_i %>
<% end %>
但它仍然显示我的错误,我会用什么来检查遥远的是否会出现然后它会显示而其他明智的不是?
答案 0 :(得分:5)
这应该有效:
<% if r.respond_to?(:distant) %>
但是视图中的逻辑太多了,我建议您重构一些代码,以便在视图中使用非常简单和安全的方法
答案 1 :(得分:1)
试试这个
<%= r.try(:distant) %>
答案 2 :(得分:0)
我会用另一种方法:
user = if longitude.present? && latitude.present? && fulladdress.present?
distantQuery = QUERY_BODY_HERE
User.select(SELECT_QUERY_HERE).where(distantQuery)
else
User.all
end
unless user.respond_to(:distant)
class << user
def distant ; nil ; end
end
end
此方法的优势在于您拥有一致的User
类,无论是否已计算,都能正确回复#distant
。