如何将2个db列映射到一个属性

时间:2010-01-15 23:32:27

标签: ruby-on-rails activerecord

鉴于迁移

class CreateTalks < ActiveRecord::Migration
  def self.up
    create_table :talks do |t|
      t.integer :duration_hours
      t.integer :duration_minutes
    end
  end

  def self.down
    drop_table :talks
  end
end

和模型

class Talk < ActiveRecord::Base
end

和对象

class Duration
   attr_accessor :hours, :minutes
end

如何将duration_hours和duration_minutes列映射到Talk中的Duration属性,以便我可以

d = Talk.first.duration
hours = d.hours
minutes = d.minutes

我知道在这种情况下我可以将小时和分钟转换为秒并将它们存储在一个列中,但我希望了解如何使用ActiveRecord实现这种类型的映射。

3 个答案:

答案 0 :(得分:0)

编写自定义访问器方法。

答案 1 :(得分:0)

我不确定我理解你要完成什么...特别是将时间和分钟存储在两个不同的列中,而不是存储日期/时间并提取小时和分钟.... buuuut ..我对attr_accessor的理解是:

attr_accessor :duration_hours

等于:

def duration_hours
  @duration_hours
end

def duration_hours=(d)
  write_attribute(:duration_hours, d)
end

那么Eimantas所指的是定制上述方法来存储或显示您认为合适的信息......您应该已经能够做到:

d = Talk.first
hours = d.duration_hours
minutes = d.duration_minutes

右?

编辑:

如果您正在尝试列出讲座或其他内容以及每次使用列的时间,我会这样做(仅用于显示目的):

def duration
  @duration = self.duration_hours.to_s + ":" + self.duration_minutes.to_s
end

然后使用talk.duration进行呼叫。邋but但它有效。

答案 2 :(得分:0)

查看Rails中的composed_of实用程序;它允许您将一个或多个数据库列映射到Ruby类的实例。

参考文献: