1

現在、マイクロポストと呼ばれるオブジェクト(と思います)があります。kindという名前の列を持つデータベース内のテーブルです。これは、「購入」または「販売」のいずれかです。ホームページには、すべてのユーザーのマイクロポストのリストが 2 つのリストに分かれています。1 つは販売用マイクロポストのみ、もう 1 つは購入用マイクロポストのみです。これらの各リストの上に、それらのみを検索できる検索バーを配置しようとしています。次に、ユーザーが検索すると、列に検索結果が表示されます。

問題は、 http://railscasts.com/episodes/37-simple-search-form?autoplay=trueなど、私が見つけたすべてのチュートリアルで、独自のコントローラーを使用してオブジェクトを検索する方法を説明していることです (たとえば、マイクロポストを検索したかった)。購入したマイクロポストのみを検索するにはどうすればよいですか。または販売されているものだけを検索しますか?

編集:明確化

これが app/views/home.html.erb に追加することになっているものです

<% form_tag microposts_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>

しかし、私が欲しいのはこれらのうちの 2 つです。1 つは種類 (kind はマイクロポスト テーブルの列) を含むすべてのマイクロポストを検索し、もう 1 つは種類が販売されるすべてのマイクロポストを検索します。これの正しい構文がわかりません。

また、ここに私のmicroposts_controller.rbの関連部分があります

  def home


    @microposts=Micropost.all

    @purchases=@microposts.collect{ |m| m if m.kind == "purchase"}.compact
    @sales=@microposts.collect{ |m| m if m.kind == "sale"}.compact

  end

編集2:

@microposts、@purchases、および @sales を定義するための良い提案があります。スコープを使用するのが最善の方法だと思います。ただし、これがこの特定の質問にどのように答えるかはまだわかりません。これら 2 つの検索フォームと検索定義をどのように区別すれば、1 つは親切な販売ですべてのマイクロポストを検索し、親切な購入ですべてのマイクロポストを検索できるようになります。検索を完全に異なるものにしたい。どうにかして検索フォームを識別できますか? モデルで販売検索と購入検索を異なる方法で定義するにはどうすればよいですか。私は次のようなものを持っているはずだと知っています

def self.search(search)
  if search
    find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
  else
    find(:all)
  end
end

micropost.rb で。購入用と販売用に 1 つの定義が必要ですか?

もう一度編集します。

RoRでこの質問をより明確にしようとしました: 特定の属性を持つマイクロポストのみを検索するにはどうすればよいですか?

4

3 に答える 3

1

モデルから始めます

class Micropost < ActiveRecord::Base

  ...
  scope :purchases, where(:kind => 'purchase')
  scope :sales, where(:kind => 'sale')
  ...

必要に応じて、検索基準を使用Micropost.purchasesしたり、Micropost.salesさらに追加したりできます。.where

@sales = Micropost.sales.where('name like ?',params[:name])
@purchases= Micropost.purchases.where('name like ?',params[:name])

ビューには、次のような @purchases と @sales を表示する 2 つのリストがあります。

<%-    @purchases.each do |one_purchase} %>
<%=      one_purchase.name %>
%br
<%-    end %>

<%-    @sales.each do |one_purchase} %>
<%=      one_purchase.name %>
%br
<%-    end %>
于 2012-09-26T01:04:50.283 に答える
0

ActiveRecord Query Interfaceでこのガイドを読む必要がありますが、質問に対する答えは次のとおりです。

@purchases = Micropost.where(['`microposts`.kind = ?', 'purchase'])
@sales = Micropost.where(['`microposts`.kind = ?', 'sale'])

スコープを設定することもできます。

検索に関しては、シンプルで軽量なソリューションとしてThinkingSphinxをお勧めします。

micropost次のようにスコープとインデックスを設定できます。

class Micropost < ActiveRecord::Base

  # ...

  scope :purchases, where(:kind => 'purchase')
  scope :sales, where(:kind => 'sale')

  # Here you can define which columns are searchable.

  define_index do
    indexes :name
  end

  # You can even search based on associations, but this is even more complicated
  # and outside the scope of this question. My point: It's very adapatable..

  # Using a sphinx_scope..
  sphinx_scope(:by_kind) { |kind| { :conditions => { :kind => kind } } }

end

スフィンクス エンジンは、ThinkingSphinx を介して簡単に使用できます。たとえば、コントローラーで次のようにします。

def search
  @microposts = Micropost.search(params[:query]).compact

  respond_to do |format|
    format.html
  end
end

# Or, using the sphinx_scope:
# Assumes params[:kind] contains either 'sale' or 'purchase'
def search_by_kind
  @microposts = Micropost.by_kind(params[:kind]).search(params[:query]).compact

  respond_to do |format|
    format.html
  end
end

あなたの姿で..

<select id="select_kind" name="kind">
  <option value="purchase" selected="selected">Purchase</option>
  <option value="sale">Sale</option>
</select>

.. これは .. に変換されparams[:kind]ます

于 2012-09-26T00:22:04.983 に答える
0

テーブルを検索する場合は、jQuery プラグインであるDataTablesをお勧めします。それはあなたがやりたいことをすることを可能にします。さらに、動的フィルタリングを行います。

于 2012-09-26T00:16:47.593 に答える