新手问题 rails 下,如何在迭代中给属性赋值?

kitaro000 · 2015年05月08日 · 最后由 msg7086 回复于 2015年05月09日 · 2228 次阅读
lass Menu < ActiveRecord::Base
  attr_accessor :children
end

children 属性是不存数据库的

parents = Menu.all
parents.map do |p|
  p.children = [1,2,3]
end
parents.inspect

输出的东西却没有 children 属性,这是为什么?

parents[0].children, 数据在。可能 ar 本身只显示数据库吧。

#1 楼 @chenge 我想把 parents 转成 json 格式,直接 to_json 是不行了?还是没有 children

#2 楼 @kitaro000 可以考虑 jbuilder。或者自己加一个 json 字段不行么?

兄弟 不太清楚你的具体需求 还是推荐你加个字段

class Menu < ActiveRecord::Base
  serialize :children, JSON
end

如果你用 PostgreSQL,就更方便了。 另外你的写法也是没问题的,只是 AR 里面的 inspect 是被覆写过的,只显示数据库字段,parents[0].children 是赋值好的。

我只想利用 ztree 做个树形菜单,数据格式是这样的

var nodes = [
    {name: "父节点1", children: [
        {name: "子节点1"},
        {name: "子节点2"}
    ]}
];

Menu 模型有 parent_id,做了自关联。 原来用 java 时,children 属性很容易赋值,最后把整个 parents 集合转成 json,很方便。 现在到这里却有问题,而且用别的方法实现感觉很绕远。。。

@kitaro000 你这个在数据库里应该每个节点是一条记录,然后用 jbuilder render 一个 json 出来 https://github.com/rails/jbuilder

7 楼 已删除

#7 楼 @48hour 不行,map 回返回新的数组,就是一堆 [1,2,3],而 each 还是会返回原先的 parents 集合,但 children 值是有的,可以用 parents[0].children 取到。只是对于 parents 集合,无论是 to_s,to_json 还是 inspect,都看不到。看来只能用 jbuilder 组装了

子节点下面还有子节点吗? 试试这个

parents.map do |u| 
  u.attributes.extract!('name').merge(children: u.children.map { |c| c.attributes.extract!('name') })
end

其实我觉得菜单并不是经常更新的东西,写死算了,或者序列化写到数据库里面

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