我在访问/ 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>
。这似乎是我想做的一件简单事 - 我错过了什么?
答案 0 :(得分:2)
where
函数返回ActiveRecord::Relation
。
因此,您可以调用first
来获取第一个元素,last
来获取最后一个元素,或all
来获取存储在名为@wanted_ads的数组中的所有元素。
@wanted_ads = WantedAd.where(:user_id => params[:id]).all
然后,您可以浏览此数组并选择要传递给每个元素视图的属性。
只是提示:
您的用户模型中应该有ActiveRecord关系,如下所示:
has_many :wanted_ads
在你的WantedAd模型中,像这样:
belongs_to :user
有了这个,你就有了一对一的关系。
然后,你可以这样做:
def show
@user = User.includes(:wanted_ads).find(params[:id])
end
然后,在你看来:
<% @user.wanted_ads.each do |wanted_ad| %>
<%# do something %>
<% end %>
答案 1 :(得分:0)
where
返回一个对象集合,而不仅仅是一个对象。因此,根据返回的内容,您需要致电first
以获取应该返回的单个实例,或致电each
来迭代所需广告并将其显示在您的网页上。
您在ActiveRecord::Relation
中看到pry
的实例,因为延迟加载结果的基础查询机制。 More details can be found here
答案 2 :(得分:0)
假设您的@wanted_ads
不是零,并且您希望遍历所有想要的广告......
<% @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])