我目前正在尝试使用instantsearch.js" rangelider"从我的索引数据中的出生日期创建年龄范围滑块的小部件。 检查了文档,似乎没有变换数据功能,我可以用来将出生日期转换为数字年龄数字,例如"命中"小部件 能做到。
我想到的一种方法是在索引中创建一个年龄列并每天运行一个cron作业来更新出生日期每个记录库的年龄列,但这似乎不是一个优雅的解决方案。
我想知道这种情况是否有任何变通方法或现有解决方案?
Laravel as backend解决方案(Jerska致记):
public function getAlgoliaRecord()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$this->dob_timestamp = strtotime('01-01-2100') - strtotime($this->dob);
return $this->toArray();
}
在前端:
function _calculateAge(birthday) { // birthday is a date
var ageDifMs = Date.now() - birthday.getTime();
var ageDate = new Date(ageDifMs); // miliseconds from epoch
return Math.abs(ageDate.getUTCFullYear() - 1970);
}
search.addWidget(
instantsearch.widgets.rangeSlider({
container: '#age',
attributeName: 'dob_timestamp',
tooltips: {
format: function(formattedValue) {
var dob = new Date((4102444800-formattedValue)*1000);
var age =_calculateAge(dob);
return age;
}
}
})
);
CSS:
.ais-range-slider--value{ display:none; }
答案 0 :(得分:4)
您每天运行cron的解决方案确实有效,但我认为您可以通过更轻松的方式实现这一目标。
您可以简单地为日期编制数字时间戳,并将其添加到attributesForFaceting
。您可能希望将timestamp('01-01-2100') - timestamp(birthdate)
之类的内容编入索引,否则您的滑块将在左侧较旧,在右侧较年轻。
完成后,您可以将此属性用作rangeSlider
widget的主要参数。
然后,您可以使用options.tooltips
在实际可显示的年龄中转换此时间戳,使用CSS隐藏图例值(.ais-range-slider--value
),您应该很高兴。