因此,在将我的代码转移到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那么严格,但这对我来说并不完全清楚)
答案 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子句中使用它。 (如果您不确定如何执行此操作,请提出新问题。它超出原始问题的范围。)