我个人想到用 trie 树的概念去实现。。 举个栗子,数据库记录如下:
id | route |
---|---|
1 | /publishers/:p_id/magazines/:m_id/photos/:p_id |
2 | /publishers/:p_id/magazines/:m_id |
然后构建一棵树,按照分隔符划分为词,变量转为*表示通配,is_end == true 代表有记录,id 存储数据库 id,refer_count 引用计数
root
/
publishers (refer_count=2)
|
* (refer_count=2)
|
magazines
|
* (is_end=true, id=2, refer_count=2)
|
photos (refer_count=1)
|
* (is_end=true, id=1,refer_count=1)
我用 ruby 实现了基本逻辑测试了一下。随机 100 万 url,查是很快,但是构建非常慢而且很吃内存,占了大概 2 个 G 的内存。要写出用在生产环境的代码有点难,所以嘛....
看看楼下有没有解决方案....
ruby 是可以用 execjs 运行 js,但是为啥不用 node 呢.....
无论 projectX 是否有关系,在 awesome_nested_set 眼里就是一颗二叉树,只要增加一个节点都会触发两段 sql:
update tree set lft=lft+2 where lft>n
update tree set rgt=rgt+2 where rgt>n
所以,即使你在 project1 里面加一个 article,后面无限多个 projectX,folderX... 都需要 update,这个 gem 只适用于极少改动的小规模数据表,数据一多就 GG 了
其实你有好些参数是只用一遍的,可以进行预处理不让逻辑进入循环内,比如 node, node_name 这些
另外,循环内不要查询,你这里查询数=nodes.size*interfaces.size*2,太多了,如果可以直接用 in 那不妨用一下。下面代码仅供参考..
def _assign_network_from_db
@nodes
.lazy
.map do |node_name, node|
next if node["topology_resource_id"].nil?
[node["topology_resource_id"], @interfaces[node_name]]
end
.reject(&:nil?)
.each do |id, interface|
ifaces = TopologyResourceInterface.where(topology_resource_id: id, name: interface.map(&:first))
# ....
end
end
def deal_with_interface_name
#...
end
def deal_with_iface_parent_name
#...
end
#7 楼 @numbcoder 如果只是单纯输出 json,不依赖 gem 直接用 rails 的 json.ruby 模板就行了。。
# views/**/*.json.ruby
obj = {
title: @post.title
}
if user.admin?
obj[:admin] = true
end
obj.to_json
# *_controller.rb
render json: render_to_string('**/*.json.ruby'), content_type: 'application/json'
其实这两种东西就是表达式(数据转换)和逆表达式(模式匹配)。前者是 fp 的基石,后者则是前者的解释,或者说是解构过程。
虽然说是这么说,但是对于新手而言后者明显要比前者难理解,特别是后者经常会跟递归一起出现...
也有可能重复造轮子。
Ruby 并行是半吊子,并发可不是。 基于 io 多路复用的 em,或者基于协程的 celluloid 都可以解决你的需求。如果只是简单的采集,用 typhoeus 就够了。
换个音效,配上这个插件https://atom.io/packages/activate-power-mode
试一个
str.gsub(/(?<=^\$)(\p{Word}+)(?:\s*,\s*|\s+)(\p{Word}+)(?=\s*\=)/, '\1_\2')
要暴露 scope 其实也可以用 binding
的:
a_var = 'aaa'
b = eval("#{a_var}='bbb';binding")
eval(a_var, b)
试试
class A < ActiveRecord::Base
def timestamp_attributes_for_update
[:update_time]
end
def timestamp_attributes_for_create
[:insert_time]
end
def current_time_from_proper_timezone
Time.now.to_i
end
end
:thumbsup:
不用上传,改一下 asset_host 就可以了,七牛自己会抓。
lazy initialization 主要问题是在进行初始化操作还没完成时,第二个线程插进来可能会返回一个空指针了,然后就挂了。 wiki 里面有介绍 java 使用双重检查锁定模式解决方法,另外这里也有介绍 jruby 的 lazy initialization 问题,不过并没有提到解决方法。
老詹这两场叼炸天了
后台列表可以试试这个 Gem,可以快速生成 search,filter, sort 等功能:https://github.com/bogdan/datagrid
scala,事实上现在很多语言都有借鉴 ruby 的
product.option_types.map(_.presentation).exists(_.contains("颜色"))
挂个 CMS 进去..
options = {}
options[:url] = "好看"
options[:host] = "我喜欢"
options[:customer] = {}
options[:customer][:name] = "爱死了"
options[:customer][:number] = "越看越喜欢"
options[:customer][:bills] = []
options[:customer][:bills] << {number: "白", memo: "漂亮"}
options[:customer][:bil1s] << {number: "富", memo: "漂亮"}
options[:customer][:bills] << {number: "美", memo: "漂亮"}
大家一起来找错
用 page:change
事件就可以了,另外有两个地方可以改进:
$(document).on('page:change', function() {
var isReply = $('#replies').length;
$(".info").each(function() {
if (/用户名/.test(this.innerHTML)) {
$(this).parents(isReply ? ".reply" : ".topic").hide();
}
});
});
google tips: smooth scroll anchor
[1,2,3,4].each_with_index.map { |n, i| {number: n, index: i} }
家乡企业 简历已发