函数使用Postgres数据库绘制错误,但不在Sqlite上绘制

因此,在将我的代码转移到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 < params[:page], :per_page => 2) end 

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

我已经读过某些调用适用于sqlite而不是postgres如做LIKE ? 等等。 但我对这里的错误很无能为力。

这是即将出现的错误

TutorController #index中的ActiveRecord :: StatementInvalid

PG :: UndefinedFunction:ERROR:运算符不存在:整数=字符变化LINE 1:… M“tutors”INNER JOIN“profiles”ON“tutors”。“id”=“profile … ^ HINT:No operator匹配给定的名称和参数类型。您可能需要添加显式类型转换。: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那么严格,但这并不能让我明白这一点)

 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子句中使用它。 (如果您不确定如何执行此操作,请提出新问题。它超出原始问题的范围)。