Ruby on rails Rails:显示用户';s喜欢邮电局,;在同一页上拥有自己的帖子

Ruby on rails Rails:显示用户';s喜欢邮电局,;在同一页上拥有自己的帖子,ruby-on-rails,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3.2,我是rails的新手&我已经被这个问题困扰了好几个小时了。我试图显示用户喜欢的帖子和用户的实际帖子 在我当前的代码中,我得到一个错误“未定义#的方法'title',它是从这一行提取的:” 有人能告诉我怎么才能让它工作吗?(更多代码如下) 这是我的路由文件: resources :likes, only: [:create, :destroy] resources :posts devise_scope :user do get 'register', to: 'devise/registr

我是rails的新手&我已经被这个问题困扰了好几个小时了。我试图显示用户喜欢的帖子和用户的实际帖子

在我当前的代码中,我得到一个错误“未定义#的方法'title',它是从这一行提取的:”

有人能告诉我怎么才能让它工作吗?(更多代码如下)

这是我的路由文件:

resources :likes, only: [:create, :destroy]
resources :posts

devise_scope :user do
  get 'register', to: 'devise/registrations#new'
  get 'edit', to: 'devise/registrations#edit'
  get 'login', to: 'devise/sessions#new'
  get 'logout', to: 'devise/sessions#destroy'
end
以下是“展示”视图:

<% if @posts %>
  <% @posts.each do |post| %>
    <%= link_to post.title, post %>
  <% end %>
<% end %>

显示”以下是结果

<Post id: 11, title: "testing123", user_id: 2, created_at: "2013-05-18 19:25:45", updated_at: "2013-05-18 19:25:45"> #<Like id: 23, post_id: 10, user_id: 2, created_at: "2013-05-18 21:39:17", updated_at: "2013-05-18 21:39:17">
#
当我只使用这个->
@posts=@user.posts.all
时,它就起作用了,但当我使用这个->
@posts=@user.posts.all+@user.likes.all时,问题就开始了


这给了我一个“undefined method`title'”消息。

看起来像
@user.likes
不会返回
Post
相关数组或ActiveRelation

如果假设
Like
对象具有
post\u id
属性,则您可能希望修改代码如下:


@posts=@user.posts.all+@user.likes.map(&:post)

我认为在活动记录中,它将比使用ruby map更快

@posts = Post.joins("left join likes on likes.post_id = posts.id").
where("posts.user_id ? OR likes.user_id = ?", @user.id, @user.id)
最好是在post模型中定义范围

scope :owned_or_liked_by, ->(user) { joins("left join likes on likes.post_id = posts.id").
where("posts.user_id ? OR likes.user_id = ?", user.id, user.id) }
然后你可以使用

@posts = Post.owned_or_liked_by(@user)

其他解决方案也可以工作,但这会生成一个sql查询,当您拥有大量数据时,查询速度会更快

您可能想在用户模型中添加一些内容

class User < ActiveRecord::Base

  has_many :likes
  has_many :liked_posts, :through => :likes, :source => :post

  ...

end

这是您可以采取的另一种方法,一种将其放入一个查询并可能进行排序的方法。如果您想将其全部包含在一个列表中

class Post < ActiveRecord::Base

  def self.visible_to(user)
    where('posts.user_id = :user_id or likes.user_id = :user_id', { :user_id => user.id}).includes(:likes).order('created_at desc')
  end

end

你能发布你的路线文件吗?@derek_duncan刚刚在上面添加了我的路线文件(已编辑),你能显示视图那条线在哪里吗@lis2刚刚在上面编辑了它奇怪的是,你能不能不用显示来确保你真的得到了post对象?我想这是使用post.inspect方法后的问题,但现在我得到了这个错误“未定义的方法'posts',你的
Like
类看起来像什么?它可能是@user.likes.map(&:post)(不是'posts'))我现在明白了。这很好用。想知道我是否仍然需要使用“has_many:liked_posts,:through=>:likes,:source=>:post“在我的用户模型中。现在就可以解决这个问题,但希望将来我开始实现更多的时候不会有任何问题。谢谢,你们两位,我发布了另一种我有时也会用到的方法。总的来说,我会尽量减少查询的次数,同时保持代码的可读性,以便于维护和理解!仍然习惯于rails中的关联。。非常感谢。是的,“来源”是最容易混淆的部分。它是连接模型中的“属于”,用于执行:至。在这种情况下,post关联就是我们如何通过like而不显式地称之为“posts”(因为这已经被采用了)。是的,会有很多帖子。所以我会尝试一下,因为我想让它更轻、更快速。很好,请让我知道它是否有效,但我仍然有可能没有犯错误;)这看起来更干净、更轻,但它并没有给我带来这个错误“参数数量错误(1代表0)”,我删除了“排序('created_at desc')”,现在它可以工作了。非常感谢。不过有一个简单的问题——让喜欢的人按照喜欢的方式而不是在创建时进行排序是否可行?(例如,这篇文章是5天前创建的,我喜欢&现在它显示在我今天的页面上,在我今天早些时候创建的文章之前)对不起,这应该是“订单”sort'是一种数组方法,顺序是针对活动记录的。按子级排序有点棘手,可能存在唯一性问题,但您可以尝试按顺序('likes.created_at')。你也可以试着用has_many-through方法订购。建立一个额外的关联。有很多:排序的\u喜欢:class\u name=>'Like',:order=>'likes.created\u at'。然后do有很多:sorted\u liked\u posts:through=>:sorted\u likes,:source=>:post.order('likes.created\u at')不起作用,但我将尝试第二种方法,并进行试验并回复,显示解决方案(如果我解决了)。再次感谢@Swardstried第二种方法无效。。Stick无法整理:(…帖子整理得很好,但当我喜欢一篇帖子时,它会在创建时(在他所有已经发布的帖子后面)显示在用户页面上,而不是在“喜欢”时(在他已经发布的帖子之前).我还是会解决这个问题的,但如果有人能帮忙的话,那就太有帮助了
@posts = @user.posts + @user.liked_posts 
class Post < ActiveRecord::Base

  def self.visible_to(user)
    where('posts.user_id = :user_id or likes.user_id = :user_id', { :user_id => user.id}).includes(:likes).order('created_at desc')
  end

end
@posts = Post.visible_to(@user)