0

高度な検索のためのある種の構造をようやく思いつくことができました。アイデアは、 User モデルからデータを取得する検索を行うことです。そこで、ユーザー モデルの一種のラッパーとなる検索モデルを作成しました。例: Search.search_for(options) と言うと、search_for メソッドでオプションを使用して User モデルを検索し、ページに表示できる結果を返します。値を複製する必要があると言われたので、このメソッドを思いつきましたが、基礎となる (既存の) User モデルを Search に呼び出させるだけでよいと考えました。

そのため、ユーザーが検索できるビューがあります。彼らが検索したいと指定したすべてのオプションを収集する必要があります (性別、年齢、郵便番号、子供がいるかどうか、宗教、民族性)。オプションを収集し、フォームを SearchController に送信します。

私は概念を理解していますが、Rails を初めて使用するため、実行に苦労しています。以下のコードは基本的に私が持っているものです(アプリの他の部分で満たされているため、ユーザーモデルを除いています)。これをやってのけるために、残りのコーディングをどのように完了するかわかりません。

Searches_controller:

  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

検索モデル:

 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 (高度な検索ページ):

<%= form_for @search do |f| %>
<div class="field">
  <%= f.label :gender %><br />
  <%= f.select :gender, ['man', 'woman'], :include_blank => true %>
</div>

  <div class="field">
    <%= f.label :zip_code %><br />
    <%= f.text_field :zip_code %>
  </div>
  <div class="field">
    <%= f.label :children %><br />
    <%= f.select :children, ['Yes, they live with me', 'I want kids now', "I want one someday", "Not for me"], :include_blank => true %>
  </div>
  <div class="field">
    <%= f.label :religion %><br />
    <%= f.select :religion, ["Agnostic", "Atheist", "Christian", "Catholic", "Buddhist", "Hindu", "Jewish", "Muslim", "Spiritual without affiliation", "Other", "None", "Prefer not to say"], :include_blank => true %>
  </div>
  <div class="field">
    <%= f.label :ethnicity %><br />
    <%= f.select :ethnicity, ["Asian", "Biracial", "Indian", "Hispanic/Latin", "Middle Eastern", "Native American", "Pacific Islander", "White", "Other"], :include_blank => true %>
  </div>
  <div class="actions"><%= f.submit "Search" %></div>
<% end %>

show.html (結果を表示するビュー):

<%= render @search.users %>

開発ログ:

Started POST "/searches" for 127.0.0.1 at 2013-05-06 14:00:54 -0400
Processing by SearchesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Pher65dG6gRU9NGgv2q1ot0cfjq+MELgXE6dOtvcrY0=", "search"=>{"gender"=>"", "zip_code"=>"", "children"=>"", "religion"=>"", "ethnicity"=>"Asian"}, "commit"=>"Search"}
  [1m[36m (0.2ms)[0m  [1mBEGIN[0m
  [1m[35mSQL (107.5ms)[0m  INSERT INTO `searches` (`age`, `children`, `created_at`, `ethnicity`, `gender`, `religion`, `updated_at`, `zip_code`) VALUES (NULL, NULL, '2013-05-06 18:00:54', 0, NULL, NULL, '2013-05-06 18:00:54', '')
  [1m[36m (60.1ms)[0m  [1mCOMMIT[0m
Redirected to http://localhost:3000/searches/25
Completed 302 Found in 276ms (ActiveRecord: 167.7ms)


Started GET "/searches/25" for 127.0.0.1 at 2013-05-06 14:00:54 -0400
Processing by SearchesController#show as HTML
  Parameters: {"id"=>"25"}
  [1m[35mSearch Load (0.5ms)[0m  SELECT `searches`.* FROM `searches` WHERE `searches`.`id` = 25 LIMIT 1
  [1m[36mUser Load (73.2ms)[0m  [1mSELECT `users`.* FROM `users` WHERE `users`.`zip_code` = '' AND `users`.`ethnicity` = '0' ORDER BY id[0m
  Rendered collection (0.0ms)
  Rendered searches/show.html.erb within layouts/application (81.4ms)
  [1m[35mUser Load (0.6ms)[0m  SELECT `users`.* FROM `users` WHERE `users`.`auth_token` = 'LTzif2q6921TM4pQzfmEGg' LIMIT 1
Completed 200 OK in 309ms (Views: 224.6ms | ActiveRecord: 74.3ms)
4

1 に答える 1

1

わかりました、まず、UserモデルとSearchモデルがまったく同じ属性を持っていることを確認しgender, zip_code, children, religionethnicityください。

age異なる列名が必要になるのは、範囲を検索するなど、もう少し「複雑な」ことをmin_ageしたい場合だけですmax_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 = @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 %>

そして、次のapp/views/users/_user.html.erbようなパーシャルがあることを確認してください。

<p><%= user.name %> - <%= user.email %></p> # or whatever

検索フォームに移動して新しい検索オブジェクトを作成し、URL から ID を取得します (34 としましょう)。次に、次のように入力rails consoleします。

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

# then try the users method:
@search.users

ビューが機能しない理由がわかりません。アクション@users = @search.usersの下に検索コントローラーがあることを確認してから、次のように実行します。showviews/searches/show.html.erb

<% @users.each do |user| %>
  <p><%= user.name %></p>
<% end %>

そして、それが機能するかどうかを確認してください。

于 2013-04-29T14:12:19.600 に答える