我有一个用户发布的应用。我有一个过滤器,它将根据通过params []哈希传递的值来排序和检索不同的帖子。我一直在明显存在的类方法上得到no方法错误。这是我试图运行的查询( posts_controller.rb ):
def room
select_filter = params[:post_filter]
course_id = params[:id].to_i
@posts = Post.where_filter(select_filter, course_id).order_filter(select_filter).page(params[:page])
end
每当'select_filter'的值为3时,我都会收到此错误:
undefined method `order_filter' for #<Array:0x007fa012d6eef8>
这是我的模型( post.rb ,请记住每当'select_filter'为3时我都会收到错误):
def self.where_filter(select_filter, course_id_params)
case select_filter.to_i
when 1
where('course_id = ?', course_id_params)
when 2
where('course_id = ?', course_id_params)
when 3
where('course_id = ? AND created_at > ?', course_id_params.to_i, 48.hours.ago.utc.to_s(:db))
.reject! {|i| i.net_reputation <= 0 }
else
where('course_id = ?', course_id_params)
end
end
def self.order_filter(select_filter)
case select_filter.to_i
when 1
order('created_at DESC')
when 2
sort_by {|i| i.net_reputation}
when 3
sort_by {|i| i.net_reputation}
else
order('created_at DESC')
end
end
奇怪的是,如果我在控制台中运行它,一切都很好。像这样:
Post.where('course_id = ? AND created_at > ?', 10, 48.hours.ago.utc.to_s(:db)).reject {|i| i.net_reputation <= 0 }.sort_by {|i| i.net_reputation}
赞赏任何和所有输入。
答案 0 :(得分:2)
这是因为你的“where_filter”方法在它到达时将它从活动记录关系对象更改为数组:
.reject! {|i| i.net_reputation <= 0 }
一旦发生这种情况,您就无法再将其他查询方法链接到其上。为什么不只是将“i.net_reputation&lt; = 0”作为where查询的一部分?
答案 1 :(得分:0)
出于某种原因,当我崩溃查询&amp;排序成一个类方法,它工作。但是,由于Kiminari(我用于分页)默认情况下无法对数组进行pagniate,所以我必须使用Kaminari.pageinate_array()
方法。
我的posts_controller.rb:
def room
@course = Course.find(params[:id])
select_filter = params[:post_filter]
course_id = params[:id].to_i
query_posts = Post.select_input_filter(select_filter, course_id)
@posts = Kaminari.paginate_array(query_posts).page(params[:page])
end
我的帖子.rb:
def self.select_input_filter(select_filter, course_id_params)
case select_filter.to_i
when 1
where('course_id = ?', course_id_params)
.order('created_at DESC')
when 2
where('course_id = ?', course_id_params)
.sort_by {|i| i.net_reputation}
.reverse
when 3
where('course_id = ? AND created_at > ?', course_id_params.to_i, 48.hours.ago.utc.to_s(:db))
.reject! {|i| i.net_reputation <= 0 }
.sort_by {|i| i.net_reputation}
.reverse
else
where('course_id = ?', course_id_params)
.order('created_at DESC')
end
end