MongoDB 使用 mongoid 后,Model 中添加新字段时总是提示属性不存在怎么破?

zhangner · 2013年09月07日 · 最后由 huacnlee 回复于 2013年09月07日 · 8634 次阅读

以前使用 AR 的时候,加了属性总是会 rake db:migrate 下使之生效,改成 mongoid 连接后面的 mongodb 存储后,应该是没有这个 rake 的步骤了,直接在 model 上加属性就可以了。但是使用的时候总是会提示找不到属性,如“undefined method `likes' for #”,这个要怎么破呢?还是说也有类似 rake db:migrate 这样的动作来对数据进行更新?

你 model 里面的属性是怎么写的,贴段代码看看

#1 楼 @yorzi Model 类属性定义部分

include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Taggable

paginates_per 20

field :title
field :category
field :subcategory
field :likes, type: Integer, default: 0
field :dislikes, type: Integer, default: 0
field :from
field :reference
field :summary
field :content

index({ title: 1 })
index({ category: 1})

这样写没错的,你能把代码贴全吗

“undefined method `likes' for #”

还有这个类的名称

#3 楼 @Ddl1st 使用的地方是这样写的,应该是没有问题的,这个页面的其他地方同样的方式有对其他属性的使用。

<%= content_tag :div, content_tag(:div, @news.likes, class: 'num', id: 'like_count'), class: 'latter' %>

而且 model 里边加了 field 之后,再新增记录时,看着 mongodb 里边新增的记录也是没有新加的 field。

#4 楼 @zhangner 都不知道你引用的是哪个 class,而且你发的 Model 类也没有类名,你确定引用的是这个 Model 类?

#5 楼 @Ddl1st Sure,肯定以及确定。因为其他地方也有用的。

<%= time_details(@news.created_at) %>
rake db:mongoid:purge

把整个 collections drop 掉重新创建都不成了,mongodb 里边新创建的记录还是没后面加的 likes 和 dislikes 这两属性。

生产环境?

#8 楼 @Ddl1st 本地。可以随便改,各种想法都可以试验。

我的意思是本地的 production 环境?

你 debug 试下把

#6 楼 @zhangner 在 console 里面看看有没有那个属性,另外新加属性应该需要重启一下 server

#10 楼 @Ddl1st 看着是 development 的

zhangner@elementary:~/workspace/concern$ rails c
Loading development environment (Rails 4.0.0)
1.9.3p392 :001 > 
zhangner@elementary:~/workspace/concern$ rails s
=> Booting Thin
=> Rails 4.0.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:3000, CTRL+C to stop

#12 楼 @yorzi 看过 mongodb 里边存储的数据了,新增的记录也是没有新加的这两属性。之前都试过 db:mongoid:purge 了。我 debug 瞅瞅

看下 New.fields.keys

#15 楼 @Ddl1st 木有新加的 filed 的,跟之前通过 robomongo 连过去 mongodb 看的一样。

zhangner@elementary:~/workspace/concern$ rails c
Loading development environment (Rails 4.0.0)
1.9.3p392 :001 > News.fields.keys
 => ["_id", "created_at", "updated_at", "tags_array", "title", "category", "subcategory", "from", "reference", "summary", "content"] 
1.9.3p392 :002 > 

#16 楼 @zhangner ... 弱弱的问一句你保存了没 😓

#17 楼 @Ddl1st 不至于犯这错啦,前天出现的事,折腾了两天也没看出什么名堂才发贴的。

看代码没有任何问题,重新创建一个 model,更改属性试试

#19 楼 @yorzi 先换个 model 名 ok 了,待会装个 rubymine 再 debug 瞅瞅,拿 vim 来 debug 扛不住。

#20 楼 @zhangner 直接在代码中需要做断点的地方 debugger, 然后在启动服务的终端界面调试即可,为什么非要在 rubymine 中 debug.

#21 楼 @Ddl1st 好吧 我上班是个 javaer,用习惯了 ide,利益于 vim 的强大,写代码确实是相当方便,debug 还是习惯用 ide 了……

mongoid.yml 贴出来看看

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