Ruby 寻 ActiveRecord 下某结构下获取某数据的方法

as181920 · 2013年04月19日 · 最后由 as181920 回复于 2013年04月19日 · 2571 次阅读

大致结构如下, 1,一个 post 有好多字段 fields,post 的每条记录的每个字段的值单独在 Items 表中存一条记录 2,每次新增一条记录时生成一个 uuid 作为行编号 row_id,然后对每个字段存入 items 表

class Post < ActiveRecord::Base
  has_many :fields
end

class Field < ActiveRecord::Base
  belongs_to :post
  has_many :items
end

class Item < ActiveRecord::Base
  belongs_to : field
  attr_accessible :row_id, :field_id, :content
end

问题怎么取一条记录(或者所有记录) 比如知道 Post 实例@post,以及行号@row_id 一条记录的获取可以:

@post.fields.map{|f| Item.where(row_id: @row_id,field_id: f.id).first.content }

这样要循环执行 sql 查询,有什么优化方法?

没搞懂.. 既然每个 item 有 uuid,直接用 uuid 取 item 不行么?

#1 楼 @blacktulip 举例:fields 有: id, name 6, xxx 7, 姓名 8, 描述 9, 性别 10,xx

一条记录对应 Item3 条记录如下: id,field_id, row_id, content 1, 7,uuidx,王某某 2, 8,uuidy,我是工人 3, 9,uuidz,男

我要获取一个记录是【王某某,我是工人,男】

多表查询效率太低,建议用 text 字段代替,然后用 JSON 序列和反序列化

推荐用 https://github.com/bdurand/json_record,操作封装的很好了,比如:

class Post < ActiveRecord::Base
  serialize_to_json(:json_data) do |schema|
    schema.key :title, :required => true
    schema.key :body, :required => true
    schema.key :author, Person, :required => true
    schema.many :comments, Comment
  end
end

#2 楼 @as181920 额,我感觉这个 schema 设计得有点问题...

#3 楼 @mvj3 后续功能需要对字段做一些筛选排序之类,放到 json 不容易处理,放到 hstore 应该不一定很容易做后续功能。所以先牺牲效率,一个 join 消耗 100ms 还是可以接受的,大不了页面简单点不做其它功能避免多 sql 查询。ps,有些情况对效率要求没有那么高。

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