0

ユーザーが /users/:id にアクセスしたときに、ショー ページに希望の広告を表示しようとしています。

私のコントローラーには次のものがあります:

 def show
    @user = User.find(params[:id])
    @wanted_ads = WantedAd.where(:user_id => params[:id])

そして、私の show.html.erb には次のものがあります。

<%= @wanted_ads %>  

Binding.pry によると、@wanted_ads はゼロです。実際のページで#<ActiveRecord::Relation:0x007fa3b5a93408>. これは私がやろうとしている一見単純なことです - 私は何が欠けていますか?

4

3 に答える 3

2

where関数は を返しますActiveRecord::Relation。したがって、呼び出しfirstて最初の要素lastを取得したり、最後のall要素を取得したり、@wanted_ads という配列に格納されているすべての要素を取得したりできます。

@wanted_ads = WantedAd.where(:user_id => params[:id]).all

次に、この配列を調べて、各要素のビューに渡したい属性を選択できます。

ヒント:

User モデルには、次のような ActiveRecord リレーションが必要です。

has_many :wanted_ads

WantedAd モデルでは、次のようになります。

belongs_to :user

これで、1 対 5 の関係になります。

次に、これを行うことができます:

def show
    @user = User.includes(:wanted_ads).find(params[:id])
end

そして、あなたの見解では:

<% @user.wanted_ads.each do |wanted_ad| %>
    <%# do something %>
<% end %>
于 2013-04-21T23:59:49.970 に答える
0

where単一のオブジェクトではなく、オブジェクトのコレクションを返します。返されるものに応じて、 を呼び出しfirstて返すべき単一のインスタンスを取得するか、 を呼び出して必要なeach広告を繰り返し処理し、それらをページに表示する必要があります。

ActiveRecord::Relationinのインスタンスが表示されpryているのは、結果を遅延ロードする基になるクエリ メカニズムのためです。詳細については、こちらをご覧ください

于 2013-04-21T23:49:48.770 に答える
0

@wanted_adsあなたがnilではなく、必要なすべての広告をループしたいと仮定します...

<% @wanted_ads.each do |wanted_ad| %>

<%= wanted_ad.some_attribute_of_wanted_ad %>

<% end %>  

また、コントローラーで次のコードを使用した SQL インジェクションに注意することをお勧めします。

@wanted_ads = WantedAd.where(:user_id => params[:id])

あるべき姿

@wanted_ads = WantedAd.where(":user_id => ?", params[:id])
于 2013-04-21T23:54:13.127 に答える