【问题标题】:Rails: Issue in adding alias name in rails sql queryRails:在rails sql查询中添加别名的问题
【发布时间】:2017-06-21 15:13:43
【问题描述】:

我正在开发维护应用程序。基本上我的代码中有一个方法,它被多种方法调用。该方法基本形成如下所示的sql查询。

def filter_data
  data = Student.all
  data = data.where(:id => params[:id]) if params[:id]
  data = data.where(:roll_no => params[:roll_no]) if params[:roll_no]
  return data
end

我在我的应用程序的很多地方都使用了这种方法,如下所示

def get_user_data
  data = filter_data
  data.pluck("sum(marks)")
end

现在的问题是我想在filter_data 方法中向“students”表添加内部连接。现在,由于“marks”列在两个表中,我必须在“get_user_data”方法中添加别名,如下所示。

data.pluck("sum(students.marks)")

添加别名不是问题,但我必须在使用"filter_data" 方法的整个应用程序中添加别名。这是一个非常耗时的过程,我想避免它。当sql查询中不存在别名时,有什么方法可以告诉活动记录使用“xxx”作为别名。

如果有人对此问题有任何解决方案,请告诉我。

【问题讨论】:

  • 所以你总是只想要学生marks
  • 不。它只是一个例子。在实际场景中,我的应用程序中有很多地方我使用了两个表中存在的许多列名。(有时列是两个。有时是一个,有时是10)

标签: ruby-on-rails rails-activerecord ruby-on-rails-4.2


【解决方案1】:

您可以在模型中添加别名

# alias_attribute :new_column_name, :column_name_in_db
alias_attribute :model_name_marks, :marks

所以,可能您应该能够在没有 sql 别名的情况下使用新名称。

注意:未经测试但值得一试..

另外,我认为filter_data 方法可以简化为一个查询而不是多个..

student.rb

scope :filter_by_id, ->(id) { where(id: id) if id.present? }
scope :filter_by_roll_no, ->(roll_no) { where(roll_no: roll_no) if roll_no.present? }

那么你的方法就变成了,

def filter_data
  Student.filter_by_id(params[:id]).filter_by_roll_no(params[:roll_no])
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多