我的Rails应用程序中有一个类常量,用于将整数从列映射到字符串:
TYPES = [[1, "Beginner"], [2, "Intermediate"], [3, "Advanced"]]
我可以使用它将整数转换为模型实例的人类可读字符串(例如TYPES.to_h[type_id]
),但我也想用它来SELECT
人类 - 一次读取大量记录的可读字符串。我可以使用CASE
声明:
SELECT *, CASE WHEN type_id = 1 THEN 'Beginner'
WHEN type_id = 2 THEN 'Intermediate'
WHEN type_id = 3 THEN 'Advanced'
END AS type_string FROM users;
然而,由于TYPES
数组甚至会稍长一些,因此会变得非常冗长,难以管理且耗时。是否有更好,更有效的方法从type_id
?
答案 0 :(得分:1)
您需要在数据库而不是rails上创建映射。
Create table types as (
type_id Int,
name varchar(100)
)
使用此功能,您可以添加/删除/更新类型,而您的代码不会中断
然后将这两个表加入
SELECT u.*, t.name
FROM users u
inner join types t
on u.type_id = t.type_id
如果需要rails
中的映射,则执行
select * from types
并初始化您的TYPES
变量。
答案 1 :(得分:1)
您可以随时制作另一个模型(请小心使用保留字'键入'在rails中)。 ActiveRecord非常适合这些事情。不要将这些数据存储在代码中,特别是如果您需要对其进行排序或者可能会增长。您可以创建一个用于管理管理员命名空间中仅限普通用户的体验级别的UI。
此示例使用类名ExperienceLevel
。
class ExperienceLevel < ActiveRecord::Base
has_many :users, foreign_key: "type_id"
# has an attribute called 'name'
end
将关联添加到用户
class User < ActiveRecord::Base
belongs_to :experience_level, foreign_key: "type_id"
end
然后在rails视图中引用它,因为您需要
@user.experience_level.name