我想将日志写入数据库并且我经常重复单词(系统日志,短信,语音,电子邮件),我需要将这些单词插入数字(syslog - 1,sms - 2,voice - 3,email - 4),以免堵塞基础重复词。然后选择单词而不是数字
对不起,我问错了。我已经保存了数据,我需要选择它到我的index.html.erb。查询必须如下所示:" SELECT triggerid,severity,status,types.name FROM logs,types WHERE logs.type_id = types.id;" logs.type_id =(1,2,3,3,2,2,1),types.name =(email,sms,syslog,voice),types.id =(1,2,3,4,)查询后myst be:types.name =(email,sms,syslog,syslog,sms,sms,email)。我如何在这个结果中使用activerecord?
答案 0 :(得分:0)
你是每个客户一个地址吗?:
Client.joins(:addresses)
或每个有客户信息的地址?:
Adress.join(:client)
答案 1 :(得分:0)
我不确定你想要存储这些数字的字段名称/表格,所以我只称它为“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中,并在保存记录之前将其转换为您。这样你只需传递mysql就是一个整数。
每条评论更新
如果您的关联设置正确(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')