Ruby on rails 通过ID筛选的索引页有许多子对象

Ruby on rails 通过ID筛选的索引页有许多子对象,ruby-on-rails,slim-lang,Ruby On Rails,Slim Lang,我有一个工作索引页。城市和职位都有很多:通过与工作的关系 在Jobs Index页面上,我有一个小的搜索表单,我想用它根据用户选择的城市和职位组合过滤结果 到目前为止,情况就是这样 作业索引 作业索引控制器 我希望@jobs被过滤,购买@city或@position 如果@city不存在,则只按@position过滤,反之亦然。 如果两者都不存在,那么它只是对所有作业进行分页。然而,我想到的所有代码都很长,并且充满了if语句,所以我认为我走错了路 我将如何通过@city和@position筛选@

我有一个工作索引页。城市和职位都有很多:通过与工作的关系

在Jobs Index页面上,我有一个小的搜索表单,我想用它根据用户选择的城市和职位组合过滤结果

到目前为止,情况就是这样

作业索引

作业索引控制器

我希望@jobs被过滤,购买@city或@position

如果@city不存在,则只按@position过滤,反之亦然。 如果两者都不存在,那么它只是对所有作业进行分页。然而,我想到的所有代码都很长,并且充满了if语句,所以我认为我走错了路


我将如何通过@city和@position筛选@jobs

您可以利用这样一个事实,即在执行查询时,多个where调用中的条件被连接:

@jobs = Job
@jobs = @jobs.includes(:cities).where(cities: { id: @city }) if @city
@jobs = @jobs.where(position_id: @position) if @position
@jobs = @jobs.paginate(page: params[:page], per_page: 5)

嘿,机械鱼,谢谢你的帮助。实现后,我得到错误->SQLite3::SQLException:没有这样的列:jobs.city\u id:从jobs.city\u id=1 LIMIT 5 OFFSET 0的jobs中选择jobs.*。我会用更多的信息更新我的问题,你认为发生了什么?啊,我想我知道为什么。与工作和城市的关系实际上是一种有很多贯穿关系的关系。因此,乔布斯在许多城市也有影响力。所以乔布斯实际上没有城市id。它有乔布斯。城市,其中一个id可以是这个id。你对我们如何处理这个问题有什么想法吗?
  def index     
    @cities = City.all
    @positions = Position.all

    @city = City.find(params[:city_id]) if params[:city_id]
    @position = Position.find(params[:position_id]) if params[:position_id]

    @jobs = Job.paginate(page: params[:page])
  end
@jobs = Job
@jobs = @jobs.includes(:cities).where(cities: { id: @city }) if @city
@jobs = @jobs.where(position_id: @position) if @position
@jobs = @jobs.paginate(page: params[:page], per_page: 5)