现在,我正在为我的rails项目开发最喜欢的功能。 我的代码如下。
模型
User.rb
has_many :favorites
Favorite.rb
belongs_to :user
belongs_to :post
Post.rb
has_many :favorites
我的控制器
@favorite = current_user.favorite.posts
我无法通过这种方式获得当前用户最喜欢的帖子数据。
我该怎么做?
答案 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.posts
或User.first.favorite_posts
这样的电话,您将收到所有用户最喜欢的帖子。
您可以在Docs中找到更多信息。
答案 1 :(得分:0)
由于user
和favorites
具有多对一关系。
您需要像这样找到用户的收藏
current_user.favorites #notice the plural of favorite
希望它有所帮助!
答案 2 :(得分:0)
要添加到Tobias
的答案,这看起来像标准的has_many :through
关联。这样可以直接访问post
个对象,允许您根据需要调用它们:
#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
。