我想写日志到数据库,我经常重复单词(syslog,sms,语音,电子邮件),我需要代替这些词插入数字(syslog - 1,短信- 2,语音- 3,电子邮件- 4),以避免堵塞的基础重复单词。然后选择单词而不是数字。
对不起,我问错问题了。我已经保存了数据,我需要选择它到我的index.html.erb。查询必须是这样的:“从日志中选择types.name、logs.type_id = types.id;logs.type_id = (1、2、3、3、2、2、1)、types.name = (email、sms、syslog、语音)、types.id= (1、2、3、4 )之后查询myst be: types.name = (email、sms、syslog、syslog、sms、email)。如何对此结果使用activerecord?
发布于 2014-09-26 14:10:56
我不知道您想要将这些数字存储在哪个字段名/表中,所以我将其命名为“FIELD_NAME”和“TABLE”。将其保存在mysql中,您可以这样做:
检索:
SELECT TABLE.*, case FIELD_NAME WHEN 'syslog' THEN 1 WHEN 'sms' THEN 2 WHEN 'voice' THEN 3 WHEN 'email' THEN 4 ELSE null END as FIELD_ALIAS FROM TABLE结果将有一个带有int值的FIELD_NAME属性,以及一个带有文本版本的FIELD_ALIAS属性。
插入(STR_VALUE是字段的字符串版本):
INSERT INTO TABLE_NAME (FIELD_NAME) VALUES (case STR_VALUE WHEN 'syslog' THEN 1 WHEN 'sms' THEN 2 WHEN 'voice' THEN 3 WHEN 'email' THEN 4 ELSE null END)我相信一个更好的选择是把这个卖给你的模型。为了简单起见,我将您的整数版本称为“int_value”。
class Address < ActiveRecord::Base
before_save :convert_int_value
def str_value
case self.int_value
WHEN 1 THEN 'syslog'
WHEN 2 THEN 'sms'
WHEN 3 THEN 'voice'
WHEN 4 THEN 'email'
end
protected
def convert_int_value
return nil unless int_value.is_a?(String)
self.int_value = case self.int_value
WHEN 'syslog' THEN 1
WHEN 'sms' THEN 2
WHEN 'voice' THEN 3
WHEN 'email' THEN 4
end
end无论何时,只要您想要int版本,只需调用模型上的int_value即可。如果您想要字符串调用str_value。此外,您还可以在int_value中存储字符串版本,在保存记录之前,它将为您进行转换。这样,您只需传递一个整数。
每条评论的更新
如果正确设置了关联(Log belongs_to :type)
Log.includes(:type).each do |l|
l.status
l.type.name #> email, sms, or syslog
end我意识到事实上还有另外一个解决方案,我想这就是你想要的。
Log.joins(:type).select('triggerid, severity, status, types.name')Alt1
Log.joins(:type).select('log.*, types.name')Alt2
Log.joins('JOINS types ON types.id = logs.type_id').select('log.*, types.name')发布于 2014-09-26 11:15:17
你想要每个客户一个地址吗?:
Client.joins(:addresses)
或者每个有客户信息的地址?:
Adress.join(:client)
https://stackoverflow.com/questions/26058218
复制相似问题