【问题标题】:Get a random, unvoted-on post in Rails在 Rails 中随机获得一个未投票的帖子
【发布时间】:2013-04-14 06:46:02
【问题描述】:

所以我有一个包含三个基本模型的 Rails 应用程序:EntryUserVote。我需要一个帮助方法,它会给我一个随机帖子供用户投票:

def next_entry
  Entry.where(:receiving_challenge_id => current_voting_challenge.id).offset(rand(Entry.where(receiving_challenge_id: current_voting_challenge.id).count)).first
end

这行得通,它每次都会抓取一个随机帖子。

投票由用户和条目拥有,它们通过数据库中的 ID 相关联。

但我不想给用户一个他们投票过的帖子。

我怎样才能做到这一点?

【问题讨论】:

    标签: mysql ruby-on-rails ruby activerecord


    【解决方案1】:

    -获取所有条目的id

    -获取用户投票的所有条目的id

    -从第一个减去第二个

    -使用sample 方法从该数组中获取任意数字,并从数据库中提取具有该ID 的条目:

    Entry.find((Entry.all.collect(&:id) - current_user.votes.collect(&:entry_id)).sample)
    

    【讨论】:

    • 样本不是被认为是非常糟糕的 Rails 实践吗?
    • 是的,但这里实际上是从 id 数组中抽取样本,而不是从 ActiveRecord::Relation 对象中抽取样本!无论哪种方式,在您的示例中,您都会“不得不”使用示例方法,因为您不知道所有条目中的所有 id,这不像在某些示例中您可以选择任何低于 10 的数字并获取一个 id ,您必须检索所有 id -> 必须检索所有记录。
    【解决方案2】:

    首先,获取他们投票的条目。 然后获取所有不同的条目

    voted_entries = user.votes.includes(:entry).collect(&:entry)
    unvoted_entries = Entry.where('id NOT IN (?)', voted_entries.collect(&:id))
    

    然后您可以在unvoted_entries 上拨打sample 来随机获取一个。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多