使用Carmen gem的Rails 4无法在查询中转换国家/地区名称

时间:2015-08-20 14:00:58

标签: ruby-on-rails ruby-on-rails-4 carmen

我正在使用carmen gem将国家/地区存储为国家代码,就像美国一样。但是当我在视图中检索国家时,我将其作为全名检索

我有一个模型用户和帐户

class User < ActiveRecord::Base
      has_one :account
    end

 class Account < ActiveRecord::Base
      belongs_to :User
    end 

 @users = User.includes(:admin, :account).
       where.not(admin: { role: 'SUPER' }).where("names like ? OR accounts.country like ?" , "%#{ search }%", "%#{ search }%")

<% @users.each do |user| %>
  <%= user.names %>
  <%= Carmen::Country.coded(user.account.country).name %>
<% end %>

我有一个用户查询,我在视图中用来查找他们国家的用户名,但在搜索中,如果我写美国,它给了我所有的国家美国的名字 但我不想用他们的国家代码搜索名称,我想写整个国家名称

我知道问题出在搜索查询中。国家代码存储在数据库中,所以它是通过代码搜索,但我无法找到如何使用carmen国家代码在搜索查询中进行名称转换 请提前帮助,谢谢

1 个答案:

答案 0 :(得分:0)

您可以通过向fuzzy: true方法传递默认为false的额外选项Carmen::Country.named(),使用模糊匹配(实际使用正则表达式)来获取 Carmen Country对象

country = Carmen::Country.named('bang')

返回nil,但

  country = Carmen::Country.named('bang', fuzzy: true) 

返回<#Carmen::Country name="Bangladesh">。现在,您可以使用country.alpha_2_code获取国家/地区2字母代码,使用"BD"返回country.alpha_3_code类似的alpha 3代码,您可以使用它来查询。

N.B:由于这里使用模糊它不会给出总是正确答案(我认为大多数情况:))除非搜索键接近实际单词。

如果我搜索Carmen::Country.named('ban', fuzzy: true)它会返回<#Carmen::Country name="Albania">,但我期待<#Carmen::Country name="Bangladesh">

您可以在fuzzy中找到lib/carmen/querying.rb(我的卡门版本是1.0.2)。我认为这可能对某人有所帮助。

已修改虽然这不是最佳答案,但您可以将实际名称保存到另一个名为country_name的列中,该值将使用after_save rails回调设置。 在回调中调用任何活动记录更新方法要小心,调用回调方法可能会导致无限循环。您可以使用不调用回调的update_column