在Ruby on Rails中映射枚举

时间:2015-04-07 13:26:51

标签: ruby ruby-on-rails-4 enums

我正在使用版本4.2的Rails API工作,我陷入了相关条目的枚举映射。我的模型正在关注

class Student < ActiveRecord::Base
  has_many :enrollments
  validates :LastName, presence: true

end

class Enrollment < ActiveRecord::Base
  belongs_to :student


  enum Grade: [:A, :B, :C, :D, :F]
end

在我刚刚检索注册列表时,我可以将成绩字段作为枚举值。但是当使用连接查询和select方法返回值时,我只得到数据库整数值。我的检索逻辑如下所示

@students = Student.joins(:enrollments).select('students.*, enrollments.*').paginate(:page => params[:page])

我的json如下:

{
students: [2]
0:  {
id: 1
LastName: "Alexander"
FirstMidName: "Carson"
Grade: 0
}-
1:  {
id: 2
LastName: "Alexander"
FirstMidName: "Carson"
Grade: 2
}-
-
}

我需要先返回Grade是'A',第二个是'C'。请帮助实现这一目标..

以下是我的rabl文件

collection :@students
attributes :id, :LastName, :Grade

node(:total) {|m| @students.total_entries }
node(:total_pages) {|m| (@students.total_entries.to_f / @students.per_page).ceil }

2 个答案:

答案 0 :(得分:0)

实际上,这是预期的行为,因为enum值被序列化为int到数据库 - check docs

但您可以在Enrollment内实施自己的方法,为您呈现适当的成绩:

class Enrollment < ActiveRecord::Base
  # rest of the code

  def formatted_grade
    self.Grade.to_s
  end
end

所以你可以在你的视图中使用它:

<%= enrollment.formatted_grade %>

或转换to json时:

enrollment.to_json(methods: :formatted_grade)

请查看我的其他answer关于enum

希望有所帮助!

答案 1 :(得分:0)

我找到了两个选项来完成这项工作。但我不知道最好的方法。我会在这里发布选项,所以你们都可以建议和建议..

选项1:将枚举放入返回模型   在这里,我使用了Students.joins(:enrollments),以便返回的数据将作为学生模型数组(我的假设)。这里rails验证Student模型中的枚举而未找到,因此它返回原始整数。但是如果我们在学生模型中编写枚举定义,它将像我们想象的那样返回。这是更改

学生模特班:

class Student < ActiveRecord::Base
  has_many :enrollments
  validates :LastName, presence: true

  enum Grade: [:A, :B, :C, :D, :F]
end

数据获取控制器中的代码

@students = Student.joins(:enrollments).select('students.*, enrollments.Grade').paginate(:page => params[:page])

Rabl中的响应模板

collection :@students
attributes :id, :LastName, :FirstMidName, :Grade

node(:total) {|m| @students.total_entries }
node(:total_pages) {|m| (@students.total_entries.to_f / @students.per_page).ceil }

但我不知道这是在我们尝试加入的每个模型中包含枚举的最佳做法。


选项2:始终使用在联接的左(第一)侧具有枚举定义的模型

这里我尝试使用我在选项1中写的假设的技术。所以我们已经在Enrollment模型中进行枚举定义,所以我颠倒了数据获取查询。所以只能在查询中进行更改。

学生模特班: 没有变化

数据获取控制器中的代码

@students = Enrollment.joins(:student).select('students.*, enrollments.Grade').paginate(:page => params[:page])

Rabl中的响应模板 与选项1相同。

这里没有重复。但最好是清楚了解查询顺序。


现在我使用了选项2.欢迎对我的解决方案提出更好的建议或建议