gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:00:05 25 4
gpt4 key购买 nike

我正在开发一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com