在我的rails应用程序中,我有一个表格设计本质上是帖子。用户可以喜欢这些设计(使用thumbs_up gem)。该表称为投票。在用户的个人资料页面上,我显示了他们喜欢(或投票赞成)的所有设计。在用户模型中,我有一个方法:
def favorites
Design.joins(:votes).where('voter_id = ?', self.id).where('voteable_type = ?', 'Design').where('vote = ?', true)
end
然后在用户的控制器中调用这些设计
def show
@designs = @user.favorites
end
这显示了他们喜欢的所有设计,但它是按创建设计时的顺序,而不是创建投票时的顺序。 Vote表有一个created_at列,所以我知道我可以根据他们喜欢的时间对这些Designs进行排序。
我试了这个没有运气
def favorites
results = Design.joins(:votes).where('voter_id = ?', self.id).where('voteable_type = ?', 'Design').where('vote = ?', true)
results.sort! {|t1, t2| t2.vote.created_at <=> t1.vote.created_at}
end
如何根据用户喜欢的设置对设计进行排序。
投票表有这些列
vote: boolean
voteable_id: integer
voteable_type: string
voter_id: integer
created_at: date
updated_at: date
谢谢!
答案 0 :(得分:1)
我认为您可以使用scope
- 我会在scope
模型上使用user
与您{{1}的投票模型进行通信实例:
user
这将允许您致电:
#app/models/user.rb
Class User < ActiveRecord::Base
has_many :votes, as :voteable
has_many :designs, through: :votes
scope :favorites, -> { joins(:votes).where('voter_id = ? AND votable_type = ? AND vote = ?', id, 'Design', true) }
scope :latest, -> { order(created_at: :asc) }
scope :latest_favorites, -> { favorites.order(created_at: :asc) }
end
答案 1 :(得分:1)
之前的答案不起作用,因为范围在类级别工作,因此当您在User实例上使用它时,它假定favorites
是实例方法或关联。
我建议您使用投票模型,并在投票中引用belongs_to Design关联:
def show
@votes = @user.votes.includes(:design).order(created_at: :asc)
@designs = @votes.collect {|v| v.design }
end
您可以随意将其移至User
模型,代替favorites
方法,如下所示:
def favorites
@favorites ||= self.votes.includes(:design).order(created_at: :asc).collect {|v| v.design }
end
由于您正在使用此thumbs_up
gem,以下内容将起作用:
在行动中
def show
@designs = @user.votes.where(voteable_type: 'Design').order(created_at: :asc).collect {|v| v.voteable}
end
或方法
def favorites
@favorites ||= self.votes.where(voteable_type: 'Design').order(created_at: :asc).collect {|v| v.voteable}
end