Rails:在rails sql query中添加别名的问题

时间:2017-06-21 15:13:44

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

我正在开发维护应用程序。基本上我在我的代码中有一个方法,它由多个方法调用。这个方法基本上形成了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

现在的问题是,我想将内部联接添加到"学生" table filter_data方法中的表。现在,"标记"列在两个表中我将不得不在" get_user_data"中添加别名。方法如下所示。

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

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

如果有人对此问题有任何解决方案,请与我们联系。

1 个答案:

答案 0 :(得分:0)

您可以在模型中添加别名

# 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