ruby-on-rails - 使用连接表排除记录出现在随机查询中

标签 ruby-on-rails ruby postgresql

我正在开发一个 Rails 应用程序,在该应用程序中,用户会收到来自用户所选类别的随机问题。如果用户已经回答了问题,我希望它永远不会再呈现给用户。

问题的答案存储在内存表中。内存表充当用户和问题之间的连接表。在 Rails 控制台中,我可以使用 question = Question.first 隔离所有已回答特定问题的用户,而 question.users 将返回已回答该问题的用户对象数组。

在 Rails 中,我无法弄清楚如何将已回答的问题排除在再次出现之外。

指导?

请注意,我的 rails/ruby 开发已经进行了大约 12 周。我怀疑这太容易了,以至于我看不到它。

My QuestionsController - 这用于呈现一个随机问题,但即使用户之前已经回答过它也会呈现:

class QuestionsController < ApplicationController

  def index
   @category = Category.find(params[:category_id])
   @question = Question.where(category_id: @category.id).sample
  end

  def show
   @question = Question.find(params[:id])
  end

end

问题模型

class Question < ActiveRecord::Base
  validates_presence_of :category_id

  has_many :memories,
    inverse_of: :question

  has_many :users,
    through: :memories

  belongs_to :category,
    inverse_of: :questions

end

用户模型

class User < ActiveRecord::Base
  validates_presence_of :first_name, :last_name, :role

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  def is_admin?
    role == 'admin'
  end

  has_many :memories,
    inverse_of: :user,
    dependent: :destroy

  has_many :questions,
    through: :memories

end

内存模型

class Memory < ActiveRecord::Base
  validates_presence_of :user, :question

  belongs_to :question,
    inverse_of: :memories

  belongs_to :user,
    inverse_of: :memories

  validates :question, uniqueness: { :scope => :user }

end

我的内存模型中的验证可防止用户回答他们已经回答过的问题 - 所以这是朝着正确方向迈出的一步。我希望这个问题一旦回答就再也不会出现。

这是我在这里的第一篇文章。很高兴加入社区,并希望有一天能够付出代价。感谢您的指导。

最佳答案

你可以试试

@question = Question.where(category_id: @category.id)
  .where("id NOT IN(select question_id from memories where user_id = ?)", current_user.id)
  .sample

关于ruby-on-rails - 使用连接表排除记录出现在随机查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21068619/

相关文章:

sql - Hibernate 4.1.2.FINAL 禁用上下文 LOB 创建,因为 createClob() 方法抛出错误,Blob 字段

ruby-on-rails - 从 GridFS 检索文件并作为常规 IO::File 传递

ruby-on-rails - Ruby on Rails - Autoprefixer 不支持 Node v4.9.1。更新它。怎么修?

java - 将时间或日期类型的信息保存到数据库中的正确方法是什么?

ruby 1.8.6 : How to alias a constant in one class to a class method in another?

javascript - 有没有办法用 ruby​​ 选择具有特定类的 html 元素?

sql - 触发器似乎是在事务之后触发的,而不是在命令/语句之后

ruby-on-rails - RailsCast 182(修订版): Jcrop not working

ruby-on-rails - Rails 在 View 上使用之前强制声明实例变量

ruby-on-rails - 元编程 String#scan 和全局变量?