Ruby on rails 设置搜索模型以环绕用户模型

Ruby on rails 设置搜索模型以环绕用户模型,ruby-on-rails,Ruby On Rails,我终于为我的高级搜索找到了某种结构。这样做的目的是通过搜索从用户模型中提取数据。因此,我构建了一个搜索模型,它将是一种围绕用户模型的包装器。例如:当我说Search.Search\u For(选项)时,在Search\u For方法中,它将使用这些选项在用户模型上搜索并返回结果,您可以在页面上显示这些结果。我提出了这个方法,因为有人告诉我必须复制这些值,但我认为我只需要对底层(已经存在的)用户模型进行搜索调用 所以我有一个用户可以搜索的视图。我必须收集他们指定要搜索的所有选项(性别、年龄、邮政编

我终于为我的高级搜索找到了某种结构。这样做的目的是通过搜索从用户模型中提取数据。因此,我构建了一个搜索模型,它将是一种围绕用户模型的包装器。例如:当我说Search.Search\u For(选项)时,在Search\u For方法中,它将使用这些选项在用户模型上搜索并返回结果,您可以在页面上显示这些结果。我提出了这个方法,因为有人告诉我必须复制这些值,但我认为我只需要对底层(已经存在的)用户模型进行搜索调用

所以我有一个用户可以搜索的视图。我必须收集他们指定要搜索的所有选项(性别、年龄、邮政编码、是否有孩子、宗教和种族)。收集选项并将表单提交给SearchController

我已经记下了这个概念,但由于我是Rails的新手,我正在努力执行。下面的代码基本上就是我所拥有的(减去用户模型,因为它充满了应用程序的其他部分)。我不知道如何完成其余的编码来实现这一点

搜索U控制器:

  def new
    @search = Search.new
  end

  def create
    @search = Search.new(params[:search])
    if @search.save
      redirect_to @search
    else
      render 'new'
    end
  end

  def show
    @search = Search.find(params[:id])
    @users = Users.search(params)
  end
end
def new
  @search = Search.new
end

def create
  @search = Search.new(params[:search])
  if @search.save
    redirect_to @search
  else
    render 'new'
  end
end

def show
  @search = Search.find(params[:id])
  @users = @search.users
end
搜索模型:

 attr_accessible :age, :children, :ethnicity, :gender, :religion, :zip_code

  def users
    @users ||= find_users
  end

  def self.search(params)

  end

private

def find_users
  users = User.order(:id)
  users = users.where(gender: gender) if gender
  users = users.where(:ethnicity => ethnicity) if ethnicity
end
new.html(高级搜索页面):


好的,首先确保
用户
模型和
搜索
模型具有完全相同的属性,因此
性别、邮政编码、儿童、宗教
种族

唯一需要使用不同列名的时间是,如果您想执行更“复杂”的操作,例如搜索一个范围,例如,如果用户表具有
age
,则搜索表可能具有
min\u age
max\u age

搜索控制器:

  def new
    @search = Search.new
  end

  def create
    @search = Search.new(params[:search])
    if @search.save
      redirect_to @search
    else
      render 'new'
    end
  end

  def show
    @search = Search.find(params[:id])
    @users = Users.search(params)
  end
end
def new
  @search = Search.new
end

def create
  @search = Search.new(params[:search])
  if @search.save
    redirect_to @search
  else
    render 'new'
  end
end

def show
  @search = Search.find(params[:id])
  @users = @search.users
end
搜索模型:

def users
  users = User.order(:id)
  users = users.where(gender: gender) if gender
  users = users.where(zip_code: zip_code) if zip_code
  users = users.where(children: children) if children
  users = users.where(religion: religion) if religion
  users = users.where(ethnicity: ethnicity) if ethnicity
  users
end
app/views/searches/show.html.erb
中:

<h1>Search results</h1>
<%= render @users %>
现在转到搜索表单并创建一个新的搜索对象,从URL获取ID(假设它是34)。 然后进入
rails控制台
,执行以下操作:

@search = Search.find(34)
# should return something like: gender: "male", zip_code: nil, children: "Yes"..

# then try the users method:
@search.users
<% @users.each do |user| %>
  <p><%= user.name %></p>
<% end %>
不确定为什么您的视图不起作用。确保您的搜索控制器中的
显示
操作下有
@users=@search.users
,然后转到
视图/搜索/show.html.erb
并执行以下操作:

@search = Search.find(34)
# should return something like: gender: "male", zip_code: nil, children: "Yes"..

# then try the users method:
@search.users
<% @users.each do |user| %>
  <p><%= user.name %></p>
<% end %>


看看这是否有效。

您是否有任何错误?哪部分坏了?请在你的问题中添加这些信息。就是这样。我不知道在我做了以上的事情之后该去哪里。这是我所能做到的,所以没有错误,因为我还没有达到那个阶段。我是新手,花了很长时间才想出这个游戏计划。所以我需要帮助来完成它,这样我才能学习。在你的
find_users
add
users
结束时,返回数组,这可能会修复它。另外,如果您在show action中定义了
@users
,那么只需使用
,如果您有
/users/\u user.html.erb
部分,这将起作用。要查看搜索是否返回了任何内容,只需将其转储到show view
好的,下面是您应该做的:将代码还原到我的答案所在的位置,确保
find_users
末尾有
users
。通过表单创建搜索对象,转到您的
rails控制台
,检查它是否与所有属性一起正确保存-然后在控制台中对其运行方法
@search.users
,查看它是否正确返回用户。啊,ok没有正确执行控制台操作。我对控制台还是很新的,这是我绝对需要更舒服的东西。现在,它向我展示了我的代码发生了什么。我对种族的搜索是“亚洲人”,在控制台中显示种族“=”0“。现在我觉得我可以开始进步,让它正确地搜索。搜索是针对多个字段的。例如性别(女性、男性)、年龄(18-79岁)、儿童偏好(有孩子、没有孩子、想要孩子)、信仰(基督教、天主教、穆斯林等)、种族(亚洲、中东、印度等)。搜索将有一个下拉框,您可以选择要搜索的内容。另外,rails cast也没有帮助,因为它没有显示如何从另一个模型获取搜索结果,这正是我正在尝试做的(它只直接从搜索页面上的信息中提取搜索结果)。我需要地雷进入用户模型。我仍然在努力解决你的方法,好吧,当我做用户=用户时,如果是种族的话,在哪里(种族:种族)。我还应该列出所有种族选择,对吗?还是说:自动拉全部?你的代码对我来说很有意义。此外,我还添加了我的用户表单,因为它应该第一次包含在内,这样人们就可以看到表单字段是什么以及它是如何完成的。搜索结果返回空白。我将发布我的更新代码。检查editI是否能够从搜索选项中删除nil。很容易修复,当我创建搜索模型时,当所有选项都假设为字符串时,我做了整数,就像在用户模型中一样。所以现在,如果我在控制台中执行搜索,它将正确显示搜索结果。虽然应用程序的搜索结果仍然显示为空白。因此,带有呈现结果的show.html页面存在一些错误。当我查看页面源代码时,搜索结果下也没有显示任何内容。实际上
nil
对搜索很有好处,这就是
search#users
中的代码的工作方式<在
if
语句中,code>nil
的计算结果为
false
。在您的控制台中尝试以下操作:
如果为nil
,则将
nil
替换为
false
true
0
。空白?
。显示?
-然后您将看到它的工作原理。