Rails连接两个表或用单词替换数字

时间:2014-09-26 11:11:39

标签: mysql ruby-on-rails

我想将日志写入数据库并且我经常重复单词(系统日志,短信,语音,电子邮件),我需要将这些单词插入数字(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?

2 个答案:

答案 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')