跪一下
支持一下
不错支持一下
我项目里装逼用了 y-combinator
那个 block 似乎应该放到 patient 里面
class Physician < ActiveRecord::Base
has_many :appointments
has_many :patients, through: :appointments
has_many :healed_patients, through: :healed_appointments, class_name: 'Appointment'
end
class Appointment < ActiveRecord::Base
belongs_to :physician
belongs_to :patient
belongs_to :healed_patient, class_name: 'Patient', foreign_key: 'patient_id'
end
class Patient < ActiveRecord::Base
HEALED = 1
has_many :healed_appointments, -> { where(state: Patient::HEALED).order('appointments.created_at DESC')}, class_name: 'Appointment'
has_many :appointments
has_many :physicians, through: :appointments
end
看起来像是 ActiveRecord 的 bug
Physician.where_has_healed_patient.include(:patients).last # 找到有治愈病人的最后一个医生
其实语义好像是这个的样子 我理解 include 只是用来拿“一对多”的“多”的,你的写法没有体现“找到有治愈病人的医生”这个意思,直接读是“我要所有医生中的最后一个,带上他的治愈病人的信息”。
不是很清楚 rails 这里具体怎么实现,只是从语义上看。
或者你就是是要找第一个医生,并带上他的治愈病人信息?
也许有帮助 https://github.com/elastic/elasticsearch-rails/issues/10#issuecomment-35114080
或者 30 条手动排序一下?
我在项目里 monkey patch 了一下,实现了根据 mapping 自动生成 as_indexed_json
# 用法
settings index: { number_of_shards: 5 } do
mappings do
indexes :title, type: 'string', :boost => 100, analyzer: "ik"
indexes :content, type: 'string', :boost => 50, analyzer: "ik_smart", as: ->(_){ self.content_text }
indexes :current_state, type: 'string', index: :not_analyzed, analyzer: :keyword, as: ->(_){ self.current_state.to_s }
end
# monkey
# 去掉请求中的 as 部分
class Elasticsearch::Model::Indexing::Mappings
def to_hash
{ @type.to_sym => @options.merge( properties: @mapping.as_json(except: :as) ) }
end
end
# 自动生成 as_indexed_json
module Elasticsearch::Model::Serializing::InstanceMethods
def as_indexed_json(options={})
build_indexed_json(
target.class.mappings.instance_variable_get(:@mapping),
target,
{id: target.id.to_s}
).as_json(options.merge root: false)
end
private
def build_indexed_json(mappings, model, json)
return json unless model.respond_to? :[]
if model.kind_of? Array
build_array_json(mappings, model, json)
else
build_hash_json(mappings, model, json)
end
json
end
def build_array_json(mappings, model, json)
return json unless model.respond_to?(:[]) && json.kind_of?(Array)
model.each do |elem|
elem_json = if elem.kind_of? Array then [] else {} end
json << elem_json
build_indexed_json(mappings, elem, elem_json)
end
end
def build_hash_json(mappings, model, json)
return json unless model.respond_to?(:[]) && json.kind_of?(Hash)
mappings.each_pair do |field, option|
# Custom transformer
if option.has_key?(:as) && option[:as].kind_of?(Proc)
json[field] = target.instance_exec(get_field(model, field), &option[:as])
# A nested field
elsif option.has_key?(:properties)
json[field] = if get_field(model, field).kind_of? Array then [] else {} end
build_indexed_json(option[:properties], get_field(model, field), json[field])
# Normal case
else
json[field] = get_field(model, field)
end
end
end
def get_field(model, field_name)
model.try(:[], field_name) || model.try(field_name)
end
end
终于 5:2 了
谢谢 :plus1:
#75 楼 @mrpasserby 和 ruby 无关吧。。。
#79 楼 @cisolarix 哈哈
2014 年 8 月上海 21.5k,Ruby 的话 14 年 12 月上海 8k
ruby 本来就有点反对规范的意思
觉得 if else 太多一般都是逻辑没有理清楚,没有做好 OO
nodejs eventmachine 不用等 IO 速度快适合 web 应用啊
好像可以这样
class Object
def lazy_send(method_name, *args)
->(obj=self) { obj.send method_name, *args }
end
end
names.map(&lazy_send(:[], -1)) # 所有名字的最后一个字
可以和 joyce 一起去看话剧
给链接加一个 click 事件处理,ajax 把相关数据 post 给服务器
就差一个 mac 了
heroku + 七牛,七牛管存图片,我反正这么做的