首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >rails 5算法搜索-按用户状态筛选结果

rails 5算法搜索-按用户状态筛选结果
EN

Stack Overflow用户
提问于 2018-09-28 04:33:47
回答 2查看 372关注 0票数 0

我试图过滤搜索结果显示使用藻类宝石,这取决于当前用户是否携带‘管理’状态。

所有用户都可以创建客户,但是“admin”用户可以访问所有客户,而不管这些客户是否由该用户创建。我还在为我的“用户”模型使用devise。

客户控制器:

代码语言:javascript
运行
AI代码解释
复制
def index
  if current_user.admin
    @customers = Customer.all.order(id: :desc).paginate(:page => params[:page], :per_page => 4)
  else
    @customers = Customer.where(user: current_user).order(id: :desc).paginate(:page => params[:page], :per_page => 4)
  end
end

我正在使用algolia宝石搜索customers#index中的客户。

搜索JS:

代码语言:javascript
运行
AI代码解释
复制
<!-- Algolia search JS -->
<script>
  var client = algoliasearch('x', 'x');
  var index = client.initIndex('Customer');
  //initialize autocomplete on search input (ID selector must match)
  autocomplete('#aa-search-input',
{ hint: false }, {
  source: autocomplete.sources.hits(index, {hitsPerPage: 5}),
  //value to be displayed in input control after user's suggestion selection
  displayKey: 'name',
  //hash of templates used when rendering dataset
  templates: {
      //'suggestion' templating function used to render a single suggestion
      suggestion: function(suggestion) {
        return `<span>${suggestion.first_name.value}"</span>` +;
      }
    }
  });
</script>

我需要做的是过滤自动完成建议,这取决于登录用户是否是“admin”用户。这只需要过滤该特定会话的索引,以便多个同时登录的用户不会影响其他用户可用的客户索引。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-27 02:59:55

解决了!解决方案如下:我在“客户”索引中创建了“user_id”记录:

Customer.rb

代码语言:javascript
运行
AI代码解释
复制
attribute :user_id do
  user.id if user
end

然后,我使用SrcParams.filter根据user_id过滤结果:

JS文件

代码语言:javascript
运行
AI代码解释
复制
var client = algoliasearch('x', 'x');
var index = client.initIndex('Customer');
let admin = document.getElementById("admin-field").innerText; // returns "true" for admins
let userId = parseInt(document.getElementById("id-field").innerText); // returns the integer value of the user's id

var srcParams = { hitsPerPage: 5}

// conditionally set filter based on admin
if (admin != "true") {
  srcParams.filters = `user_id=${userId}`;
}

autocomplete('#aa-search-input', {
  hint: false
}, {
  // use the srcParams
  source: autocomplete.sources.hits(index, srcParams),
   displayKey: 'name',
  templates: {
    suggestion: function(suggestion) {
    console.log(srcParams);
    return  `<span>${suggestion.first_name.value}"</span>` ;
    }
  }
});
票数 0
EN

Stack Overflow用户

发布于 2018-09-28 10:08:45

从设计上看,Algolia不是一个关系数据库。

它不知道是哪个user has_many customers,还是一个customer belongs_to user。它也不知道设计和用户是管理员。

要在Algolia中复制这种关系,您必须创建一个将关系保存在属性中的“平面对象”。

例如,您的“客户”索引可能有一个属性列表中可以查看它们的记录。您可以将其命名为viewable_byuser_ids,任何您想要的(如果您没有“用户”索引,那么这些可以是数据库中的id,不管是什么都行):

代码语言:javascript
运行
AI代码解释
复制
// sample Customer record in Algolia
{
    "name": "Ricky Bobby",
    "viewable_by": [1, 55, 278]
}

接下来,我将依赖您从Rails传递您的current_user.admin (true/false)和用户id,以便您可以在JS条件中引用它。

然后,在“自动完成”中,创建一个条件参数集。如果current_user.adminfalse,那么在用户id上筛选

代码语言:javascript
运行
AI代码解释
复制
<!-- Algolia search JS -->
<
script >
  var client = algoliasearch('BFBCTI275G', '5818cd87afb6c0ef5e4d5ec4ed6580d0');
var index = client.initIndex('Customer');

// create variable
var srcParams = {
  hitsPerPage: 5
}

// conditionally set filter based on admin
// your job to get admin boolean and user id into JS
if (!current_user.admin) {
  srcParams.filters = 'viewable_by: current_user.id';
}

autocomplete('#aa-search-input', {
  hint: false
}, {
  // use the srcParams
  source: autocomplete.sources.hits(index, srcParams),
  displayKey: 'name',
  templates: {
    suggestion: function(suggestion) {
      return `<span>${suggestion.first_name.value}"</span>` + ;
    }
  }
}); <
/script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52555454

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文