Rails - 连接表以对帖子进行排序

时间:2014-01-16 15:18:57

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

在我的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

谢谢!

2 个答案:

答案 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

https://github.com/bouchard/thumbs_up