我如何根据用户获得收藏帖子

时间:2015-12-09 07:24:23

标签: ruby-on-rails ruby-on-rails-4

现在,我正在为我的rails项目开发最喜欢的功能。 我的代码如下。

模型

User.rb

has_many :favorites

Favorite.rb

belongs_to :user
belongs_to :post

Post.rb

has_many :favorites

我的控制器

@favorite = current_user.favorite.posts

我无法通过这种方式获得当前用户最喜欢的帖子数据。

我该怎么做?

4 个答案:

答案 0 :(得分:3)

您必须与many-to-many建立has_many :through关系。

尝试这样的事情:

用户模型

class User < ActiveRecord::Base
  has_many :favorites
  has_many :posts, through: :favorites # OR
  has_many :favorite_posts, class_name: 'Post', through: :favorites  # <= If you want to make it more clear you can add it also in this way
end

喜欢的型号

class Favorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
end

发表

class Post < ActiveRecord::Base
  has_many :favorites
  has_many :users, through: :favorites
end

添加此关联后,您可以拨打User.first.postsUser.first.favorite_posts这样的电话,您将收到所有用户最喜欢的帖子。

您可以在Docs中找到更多信息。

答案 1 :(得分:0)

由于userfavorites具有多对一关系。

您需要像这样找到用户的收藏

current_user.favorites #notice the plural of favorite

希望它有所帮助!

答案 2 :(得分:0)

要添加到Tobias的答案,这看起来像标准的has_many :through关联。这样可以直接访问post个对象,允许您根据需要调用它们:

enter image description here

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :favorites
   has_many :posts, through: :favorites
end

#app/models/favorite.rb
class Favorite < ActiveRecord::Base
   belongs_to :user
   belongs_to :post
end

#app/models/post.rb
class Post < ActiveRecord::Base
   has_many :favorites
   has_many :users, through: :favorites
end

这将允许您致电:

@favorite_posts = @user.posts

-

可以按如下方式进行小的改动:

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :favorites
   scope :favorite_posts, -> { includes(:posts).where(post: {id: favorites.pluck(:post_id)}) }
end

这将允许您调用@posts = current_user.favorite_posts并根据需要返回所有帖子对象。

答案 3 :(得分:-3)

此类系统的更好方法是在window.onload = function() { $get("phrase").value=''; }; User之间建立多对多关联,以便您可以直接访问用户添加到其收藏夹的帖子名单。但是,如果您仍想继续使用当前设计,则以下代码可能会派上用场:

Post

这将首先获得current_user.favorites.collect(&:post) 所有current_user个对象,然后针对每个收藏记录返回相对favorite