Rails: проблема с добавлением псевдонима в sql-запрос rails

Я работаю над приложением обслуживания. В основном у меня есть метод в моем коде, который вызывается несколькими методами. Этот метод в основном формирует 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. Теперь, поскольку столбец «marks» находится в обеих таблицах, мне придется добавить псевдоним в метод «get_user_data», как показано ниже.

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

Добавление псевдонима не проблема, но мне придется добавить псевдоним во все мое приложение, где используется метод "filter_data". Это очень трудоемкий процесс, и я хочу избежать его. есть ли способ указать активной записи использовать «xxx» в качестве псевдонима, когда псевдоним отсутствует в запросе sql.

Пожалуйста, дайте мне знать, если у кого-то есть какие-либо решения для этой проблемы.


person Sanjay Salunkhe    schedule 21.06.2017    source источник
comment
Значит, вы всегда хотите, чтобы ученики были только marks?   -  person Pavan    schedule 21.06.2017
comment
Нет.. это просто пример.. в реальном сценарии в моем приложении есть много мест, где я использую много имен столбцов, присутствующих в обеих таблицах (иногда столбцов два, иногда один, а иногда 10).   -  person Sanjay Salunkhe    schedule 21.06.2017


Ответы (1)


вы можете поместить псевдоним в модели как

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

Итак, вероятно, вы сможете использовать новое имя без псевдонима sql.

Примечание. Не проверено, но стоит попробовать.

Также, я думаю, метод filter_data можно свести к одному запросу вместо нескольких..

in 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
person Md. Farhan Memon    schedule 22.06.2017