Rails 在 Rails 中,数据库查出的数据是怎么组装成对象的?

kitaro000 · 2015年09月06日 · 最后由 kitaro000 回复于 2015年09月12日 · 2243 次阅读

比如我在一个 model 中定义 driver

attr_accessor :driver

我在查询时就可以如下方式将 driver 字段映射到对象

model.select("models.driver AS driver")

model.driver model[driver] 就可以调用(driver 是个字符串) select 方法只会返回 attributes 的 hash,并不会给 @driver 赋值

现在 driver 不再是字符串,而是一张表,在一个较复杂的多表联查中,且在不联查 driver 表的情况下,我能拿到 driver_id 那问题来了,model 要怎么初始化 driver 呢? 我试过以下方法,但是不管用

attr_reader :driver
def driver=(driver_id)
  @driver = Driver.find(driver_id)
end

各位大神支个招吧,或者告诉我 rails 组装对象那部分的源码在哪里也好啊~

楼主先讲讲你是想干嘛? 你的做法好奇怪,没见过这么用 ActiveRecord

各数据库的组装方式不同,代码在它们的 driver 中

我其实没看懂你想要什么,我猜测是不是

new_instance = MyModelClass.allocate
new_instance.init_with("attributes" => instance_attributs, "new_record" => false)

你想要的是在初始化一个 activerecord 对象时去塞一些数据?after_initialize 方法

after_initialize do
   self.driver = Driver.find(driver_id) # 建议用对象的关联关系
end
def driver
  @driver ||= Driver.find(self.driver_id)
end

你要的难道是这个效果?

不好意思,这几天忙成狗没时间回帖。感谢各位的回复! 像 select 查询出来的数据是个 hash 表,我也只能用 hash 的方式取数据,但我更想使用对象属性的方式去取。 楼上两位的方法是可以的,但我需要先设置attr_accessor :driver_id,再写个driver方法,不过也够我用的了^-^。

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