MongoDB Mongoid 能否支持虚拟字段?

rimer · 2013年07月11日 · 最后由 Rei 回复于 2013年07月11日 · 2747 次阅读

我刚刚从 Node.js & Mongoose 转来,尝试使用 Grape 和 Mongoid 重写以前的程序。现在遇到了一个问题:

Mongoose 支持 Virtual 字段( http://mongoosejs.com/docs/guide.html#virtuals ),比如有两个 key,firstName 和 lastName,可以建立一个 Virtual 的 name 字段以方便使用,同时 Mongoose 不会将 name 字段存入数据库中。

然而我发现在 Mongoid 的文档中没有找到对应的内容,我自己尝试如下方法:

class User include Mongoid::Document field :firstName, type: String field :lastName, type: String

def name "#{self.firstName} #{self.lastName}" end

end

这样可以实现通过 user.name 得到用户的信息,但是想使用如下方式直接将其作为 Grape 的 Response body 时则不会包含 name 字段:

get do User.find(...) end

我猜想也许是 Mongoid 对 to_json 做了处理,但更进一步的解决方法就不知道了。不知道大家有没有什么解决方案,非常感谢~(≧▽≦)/~

话说体验了几天,Ruby 真的很好用~

貌似没听说类似的功能,不过通过 rails 自己的 callback 可以很轻松的实现。

#1 楼 @everett 这么晚都没睡啊。。。不用 rails 咋办捏

ruby 的方法

def attr1
end
def attr1=(abc)
end

#3 楼 @ShiningRay 这个我已经实现了,但是 Grape 的 Response 的结果中不包含自己定义的字段,是不是需要重载 to_json

#4 楼 @rimer 貌似需要,或者用 ActiveModelSerializer?

应该不关 Mongoid 的事,是 Serializer 的事 估计是在将 Model 序列化时默认只有 Model 的 attribute,所以做序列化时加上对应的字段应该可以解决 不清楚 lz 是怎样做序列化,我自己是使用 ActiveModelSerializer,可以很轻松解决这个问题

@rimer 我好像有点明白你的需求了,你需要直接通过 name 进行检索。如果是 User.where(first_name: xxx).where(last_name: xxx) 呢 如果需要让用户直接通过输入 name 搜索的话,也许可以通过正则或者其他什么的做分割。

是 to_json 处理。

试试

get do
  User.find(...).to_json(:methods => [:name])
end

我没用过 Grape,不知道是否正确。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号