我自首,跑去测试了
我用 Google task.
class Servey
include Mongoid::Document
embed_many :columns
has_many :answers
def check_validate(answer)
columns.each do |column|
column.errors.add(column.name, "some message") unless column.check_validate?(answer[column.name])
end
end
end
class Column
field :name
embed_in :servey
def check_validate?(value)
raise "Not implement yet."
end
end
class StringColumn < Column
def check_validate?(value)
#do nothing
end
end
class RangeColumn < Column
field :max, :type => Integer
field :min, :type => Integer
def check_validate?(value)
value <= max && value >= min
end
end
class CheckColumn < Column
field :values, :type => Array
def check_validate?(value)
values.include?(value)
end
end
class Answer
include Mongoid::Document
belongs_to :servey
attr_protected :servey_id
validates :servey_validate
def servey_validate
servey.check_validate(self)
end
end
# controller
def create
@answer = @survey.answers.new params[:answer] # DYNAMIC FIELDS http://mongoid.org/docs/documents/dynamic.html
if @answer.save
#...
else
#...
end
end
你要做的可能是设计 validation 这块,创建问卷的时候保存校验信息,然后储存答卷的时候调用校验。
如果没有校验,mongodb 尽可以随意储存不同的 field 的文档。
> db.answers.insert({name: 'Rei', age: 24})
> db.answers.insert({weather: 'cold', temperature: [-1, 4]})
> db.answers.find();
{ "_id" : ObjectId("4ed3b3ad665202a0ac36e109"), "name" : "Rei", "age" : 24 }
{ "_id" : ObjectId("4ed3b3ea665202a0ac36e10a"), "weather" : "cold", "temperature" : [ -1, 4 ] }
不要想类,想文档。
用户提交的是文档,数据库储存的是文档,到底需要类做什么呢?
你的需求是如何保存问卷格式和问卷结果,而不是如何动态生成类。
你还没明白不应该这样弄么
what_ever = Class.new # 生成一个类
自己新建一个 tmp/pids 文件夹,然后执行,不用 root
因为这个问题我一有大 js 就包裹成 gem
今天不实现这个功能,明天网站会崩溃吗? 奥,不会,那先放着吧
undefined local variable or method `root_path'
是否有在路由中设置 root?
把完整的 Log 贴出来
现在默认参数是跑一次 bundle,rails new 的时候有个参数可以指定不跑 bundle,可以查下文档。中国的网络对开发者真是悲剧。
我认可 linus 式的独裁管理,能实质把握网站走向的其实就是@huacnlee。现在一点问题是功能加太快,有点糙。社区/wiki/文章也许要分别指定负责人才行。
#14 楼 @wxianfeng Gemfile.lock 已经锁定了
#10 楼 @aNdReW_Qx 赞同。过早使用缓存会得不偿失,比如——在这个加个 xx 功能吧?不行,这样缓存就失效了/要重大修改,那还是放到别的地方吧或者不要提供了——这种情况出现。
#8 楼 @aNdReW_Qx idendity_map 是同一对话内有效,存到外部的 cache 就可以各个会话共享(这时候对象序列化速度有可能成为瓶颈)。
另一种思路是对象缓存,在 ITeye 大量使用。比如 User.find id,这种调用都是从 memcached 获取对象的,好处是缓存一次,到处调用。Twitter 放出的资料来看也是偏向这种,行缓存(数据)+ 列缓存(timeline)+片段缓存
条件允许的话用 redis 或者 memcached 比较好,用数据库字段缓存意义不大。像现在的一条回复,不单是文本的格式处理重复耗时,而且 user 信息的读取还会导致 1 + N 查询,另外还有 @ mention 的查询。这时候最好的方案就用片段缓存,把一条回复片段 cache 起来,这样一来数据库里面做缓存做优化就失去作用了。所以说缓存要后加,找到瓶颈才出手。
悬停效果在触摸为主的终端体验很不好的,除非有精力另外开发一套移动界面(Twitter 是靠 APP)