Ruby on rails 如何在finder where子句中有条件地包含参数?

Ruby on rails 如何在finder where子句中有条件地包含参数?,ruby-on-rails,arguments,where,ruby-on-rails-5,finder,Ruby On Rails,Arguments,Where,Ruby On Rails 5,Finder,我在Postgres9.5中使用Rails5。如何在finder where子句中有条件地包含参数?我有下面的 def self.find_by_name_and_hometown_and_age(user) search_criteria = ["my_objects.user_id is null"] # Name criteria search_criteria.push("upper(my_object_times.name) = ?") # Hom

我在Postgres9.5中使用Rails5。如何在finder where子句中有条件地包含参数?我有下面的

  def self.find_by_name_and_hometown_and_age(user)
    search_criteria = ["my_objects.user_id is null"]
    # Name criteria
    search_criteria.push("upper(my_object_times.name) = ?")

    # Hometown criteria
    search_criteria.push( "upper(my_object_times.city) = ?" ) 
    if user.address.state_id 
      search_criteria.push( "my_object_times.state_id = ?" ) 
    end
    if user.address.country_id
      search_criteria.push( "my_object_times.country_id = ?" ) 
    end

    # Age
    search_criteria.push( "date ? + interval '1 year' * my_object_times.age between my_objects.day - interval '1 year' and my_objects.day + interval '1 year'" ) 

    results = MyObjectTime.joins(:my_object,
                              "LEFT JOIN user_my_object_time_matches on my_object_times.id = user_my_object_time_matches.my_object_time_id").where( search_criteria.join(' and '),
                                                                                                                                "#{user.first_name.upcase} #{user.last_name.upcase}",
                                                                                                                                "#{user.address.city}",
                                                                                                                                "#{user.address.state_id}",
                                                                                                                                "#{user.address.country_id}",
                                                                                                                                user.dob ) 
  end

请注意,如果没有“user.address.state\u id”字段或“user.address.country\u id”字段,我不会在搜索中包含条件,但我不清楚如何告诉where子句忽略这些参数。我希望只使用一个where子句。

where
子句是可链接的,所以您只需要简单的if语句

all_items = MyObjectTime.all

if some_condition
  all_items = all_items.where(...)
end

if some_other_condition
  all_items = all_items.where(...)
end

最后,
所有项目都将包含您想要的内容。

MyObjectTime.all是否执行一个查询,从数据库检索所有“MyObjectTime”对象?如果它本身是,但在您将多个where子句链接到它时不是。直到某些东西(通常是视图)尝试访问
all\u items
变量,才会调用db。所以,不,它并不是一开始就全部加载到Rails中。哦,很酷,如果你的例子中的两个条件都是真的,它会等同于两个where子句中的AND吗?是的,它会。