我正在使用版本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 }
答案 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.欢迎对我的解决方案提出更好的建议或建议