Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 与活动记录左连接或完全连接_Ruby On Rails_Activerecord_Join_Associations - Fatal编程技术网

Ruby on rails 与活动记录左连接或完全连接

Ruby on rails 与活动记录左连接或完全连接,ruby-on-rails,activerecord,join,associations,Ruby On Rails,Activerecord,Join,Associations,我有5个模型:用户、关键字、问题、关联和问题状态 用户和关键字是通过关联关联关联的,可以使用相同的关键字 由多个用户添加,反之亦然 关键词和问题是由多个属于某个关键词而联系在一起的 可以有许多问题,并且一个问题属于一个关键字 用户和问题通过用户可以标记的问题\状态进行关联 已回答、删除等问题。 因此,这些关系是: 用户通过关联拥有许多关键字 关键字通过关联拥有许多用户 关键字有很多问题 问题属于关键词 用户可以通过问题\状态对许多问题进行状态设置 一个问题可以由许多用户通过问题状态来分配状态 我

我有5个模型:用户、关键字、问题、关联和问题状态

用户和关键字是通过关联关联关联的,可以使用相同的关键字 由多个用户添加,反之亦然 关键词和问题是由多个属于某个关键词而联系在一起的 可以有许多问题,并且一个问题属于一个关键字 用户和问题通过用户可以标记的问题\状态进行关联 已回答、删除等问题。 因此,这些关系是:

用户通过关联拥有许多关键字 关键字通过关联拥有许多用户 关键字有很多问题 问题属于关键词 用户可以通过问题\状态对许多问题进行状态设置 一个问题可以由许多用户通过问题状态来分配状态 我必须建立5个模型,因为同一个关键字可以由多个用户添加。所以我必须让用户和关键词彼此分开,并通过关联将它们联系起来。此外,多个用户可以在同一个问题上回答、删除、存档等不同的标签。因此,我必须将此状态与问题表分开维护

模型包括—

class User < ActiveRecord::Base
  has_many :associations, dependent: :destroy
  has_many :keywords, :through => :associations

  has_many :question_statuses, dependent: :destroy
  has_many :questions, :through => :question_statuses

class Keyword < ActiveRecord::Base
  has_many :questions, dependent: :destroy

  has_many :associations, dependent: :destroy
  has_many :users, :through => :associations

class Question < ActiveRecord::Base
  belongs_to :keyword

  has_many :question_statuses, dependent: :destroy
  has_many :users, :through => :question_statuses

class Association < ActiveRecord::Base
  belongs_to :keyword
  belongs_to :user

class QuestionStatus < ActiveRecord::Base
  belongs_to :question
  belongs_to :user
我需要在ActiveRecord中创建一个联接查询,该查询将为用户提供问题,例如用户在其帐户中添加的关键字的users.id=2,不包括已删除或已回答的问题,例如问题状态表中的delete=t或answered=t

只有当用户标记问题时,才会将记录添加到问题状态。否则,该用户的问题状态将不会有任何记录

任何帮助都将不胜感激。

2方法

1.使用表名

2.使用AREL

连接与上面的相同,但where子句略有不同,您可能需要在脚本/控制台中玩游戏

编辑:根据OP的反馈替换答案

以下是我认为应该使用的ActiveRecord语法:

Question.joins("LEFT OUTER JOIN question_statuses ON question.id = question_statuses.question_id AND question_statuses.user_id = #{ActiveRecord::Base.connection.quote(user_id)}").where(question_statuses: {user_id: nil})
这相当于SQL:

SELECT * from questions LEFT OUTER JOIN question_statuses ON question.id = question_statuses.question_id AND question_statuses.user_id = 2 WHERE question_statuses.user_id IS NULL;

谢谢你的及时回复。在上面的回答中,您的意思是question_status.deleted为false,因为我需要排除它们。答案与此类似。对吗?@user2376032-我想除非我做一个左连接,否则这不会起作用,因为问题状态只有那些被用户标记为已删除或已回答的记录。如果用户尚未标记任何问题,则上面的查询将返回零条记录,因为它使用问题\ U状态进行内部联接。知道如何进行左连接吗?这将创建一个内部连接,但我认为我需要左连接或完全连接,因为问题状态没有用户的任何记录,除非用户将问题标记为已回答或已删除。根据用户列表中的关键字,从问题表中为用户显示问题。我如何在您的答案中加入左键?如果我正确理解您的评论,您想要的是用户未设置任何状态的所有问题?您是对的,但您的答案假设问题状态包含所有问题,无论用户是否标记它。如果是这样的话,那么你的解决方案就行了。您的解决方案会产生以下选择问题。*从问题内部连接问题状态关于问题。id=问题状态。问题id,其中问题状态。用户id=2个问题构成问题状态的内部连接,但如果用户未标记任何问题,则问题状态将没有任何内容。问题从问题表中显示给用户。有意义。我将不得不编辑我的答案,以考虑到该结构。我无法使其工作,即使与左外连接,不知道为什么!我能够通过下面的SQL获得结果。但不知道如何在ActiveRecord中写入它。选择问题。*从问题左侧加入问题的状态。id=问题的状态。问题的id何处有问题。id不在选择问题的id何处有问题的状态。删除='t'你提到的删除=t,回答=t。这些是Rails中的布尔字段吗?如果您使用的是显式文本字段而不是布尔字段,我建议您切换到使用布尔字段,以便Rails了解您要在其中存储的信息类型。它们是布尔字段。
SELECT * from questions LEFT OUTER JOIN question_statuses ON question.id = question_statuses.question_id AND question_statuses.user_id = 2 WHERE question_statuses.user_id IS NULL;