函数在Postgres数据库中绘制错误,但在Sqlite

时间:2016-10-26 09:24:43

标签: ruby-on-rails postgresql

因此,在将我的代码转移到Postgres中的heroku之后,我的一个函数正在绘制错误。

def index
    @tutor = Tutor.where(:admin => false)
    @tutor_array = []

    @tutor_array << @tutor.fees_search(params[:fees_search]) if params[:fees_search].present?
    @tutor_array << @tutor.subject_search(params[:subject_search]) if params[:subject_search].present?
    @tutor_array << @tutor.lssubject_search(params[:lssubject_search]) if params[:lssubject_search].present?
    @tutor_array << @tutor.ussubject_search(params[:ussubject_search]) if params[:ussubject_search].present?
    @tutor_array << @tutor.jcsubject_search(params[:jcsubject_search]) if params[:jcsubject_search].present?

    @tutor_array.each do |tutor|
      ids = @tutor.merge(tutor).map(&:id)
      @tutor = Tutor.where(id: ids)
    end
    @tutor = @tutor.sort_by { |tutor| tutor.rating.rating }.reverse
    @tutor = @tutor.paginate(:page => params[:page], :per_page => 2)
end

突出显示的特定行是这个 ids = @tutor.merge(tutor).map(&:id)

我已经读过某些调用适用于sqlite而不适用于postgres,例如执行LIKE ?等。但我对这里的错误毫无头绪。

这是即将出现的错误

  

ActiveRecord :: TutorsController中的StatementInvalid #index

     

PG :: UndefinedFunction:ERROR:运算符不存在:integer =   字符变化LINE 1:... M“tutors”INNER JOIN“profiles”ON   “tutors”。“id”=“profile ... ^提示:没有运算符匹配给定的名称   和参数类型。您可能需要添加显式类型转换。 :   SELECT“tutors”。* FROM“tutors”INNER JOIN“profiles”ON“tutors”。“id”   =“profiles”。“tutor_id”INNER JOIN“profile_ussubjects”ON“profiles”。“id”=“profile_ussubjects”。“profile_id”WHERE   “tutors”。“admin”= $ 1 AND“profile_ussubjects”。“ussubject_id”= $ 2

我不知道要搜索什么来尝试解决这个问题,因为我甚至不知道触发错误的postgres是什么。

所以希望有人可以指出我正确的方向。

以下是导师模型的样子

def self.fees_search(n)
    @profile = Profile.fees(n)
    if @profile.empty?
      return Tutor.none
    else
      @profile.map do |y|
        y.tutor
      end
    end
  end

  def self.subject_search(s)
    @subject = Subject.find_by_name(s)
    unless @subject.nil?
      @subject.tutors 
    end
  end

其他主题搜索与self.subject_search完全相同。

我认为我推断出的一个问题是,在我的self.subject_search(s)方法中,通过在rails控制台中测试它,行@subject.tutors正在绘制错误。

在我的rails控制台中,我运行了subject = Subject.find_by_name("English"),然后是subject.tutors并且它抛出了错误

ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR:  operator does not exist: integer = character varying
LINE 1: ...M "tutors" INNER JOIN "profiles" ON "tutors"."id" = "profile...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

为什么?对不起,但我真的很糟糕的postgres,我不明白最新情况和为什么它与sqlite3一起使用。 (我读到sqlite3并不像postgres那么严格,但这对我来说并不完全清楚)

1 个答案:

答案 0 :(得分:-1)

def index
  @tutors = Tutor.where(:admin => false).tap do |scope|
    keys = [:fees_search, :subject_search, :lssubject_search, :ussubject_search, :jcsubject_search]
    keys.each do |key|
      scope.merge!( Tutor.send(key, params[key]) ) if params[key].present? 
    end
  end.paginate(:page => params[:page], :per_page => 2)
end

至少是一个开始。

这一行非常有问题:

@tutor = @tutor.sort_by { |tutor| tutor.rating.rating }.reverse

.sort_by从数据库中提取所有记录并在Ruby中对它们进行排序。你应该做一个子选择来获取评级的集合并在order子句中使用它。 (如果您不确定如何执行此操作,请提出新问题。它超出原始问题的范围。)