首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails连接两个表或用单词替换数字

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

Stack Overflow用户
提问于 2014-09-26 11:11:38
回答 2查看 86关注 0票数 0

我想写日志到数据库,我经常重复单词(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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-26 14:10:56

我不知道您想要将这些数字存储在哪个字段名/表中,所以我将其命名为“FIELD_NAME”和“TABLE”。将其保存在mysql中,您可以这样做:

检索:

代码语言:javascript
复制
  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是字段的字符串版本):

代码语言:javascript
复制
  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”。

代码语言:javascript
复制
  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)

代码语言:javascript
复制
  Log.includes(:type).each do |l|
    l.status
    l.type.name #> email, sms, or syslog
  end

我意识到事实上还有另外一个解决方案,我想这就是你想要的。

代码语言:javascript
复制
  Log.joins(:type).select('triggerid, severity, status, types.name')

Alt1

代码语言:javascript
复制
  Log.joins(:type).select('log.*, types.name')

Alt2

代码语言:javascript
复制
  Log.joins('JOINS types ON types.id = logs.type_id').select('log.*, types.name')
票数 0
EN

Stack Overflow用户

发布于 2014-09-26 11:15:17

你想要每个客户一个地址吗?:

Client.joins(:addresses)

或者每个有客户信息的地址?:

Adress.join(:client)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26058218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档