【问题标题】:Rails join queryRails 连接查询
【发布时间】:2021-03-30 08:31:15
【问题描述】:

我是 Rails 的新手,老实说,即使经过多次研究,我仍然在为查询而苦苦挣扎。 这是我的简单架构:

所以基本上,一个问题有很多选项,一个选项属于一个问题,有很多答案,一个答案属于一个选项,有很多用户。

我认为没有必要发布模型代码,因为它就像我上面提到的那样。

我想要做的是给出一个问题选项,看看某个特定用户是否已经检查过它(如果有行匹配给定的 id_option、user_id 和 user_type,请查看答案表)。所以在我的haml循环中,当显示不同的问题选项时,我正在调用我的question_option模型的一个方法,就像这样:

- question.question_option.all.each do |option|
    #{option.title}
    .check
        - if option.selected_by(current_actor)
            = check_box_tag(option.id, "checked",true, class: 'styled-checkbox')
        - else
            = check_box_tag(option.id, "checked",false, class: 'styled-checkbox')

以及调用的方法:

def selected_by(answerer)
  answer_match =    
    ::Vacancies::QuestionOption
      .joins(:answers)
      .where(answerer_id: answerer.id, answerer_type:answerer.type )
  response = answer_match.find(self.id)
  return response
end

此方法位于我的 QuestionOption 模型中,不会导致任何错误,但它无法正常工作。 您能帮我转换此查询以使其与 ActiveRecord 一起使用吗?谢谢

【问题讨论】:

  • “我认为没有必要发布模型代码,因为它就像我上面提到的一样。”,请做。就个人而言,更容易查看模型并知道如何复制您的场景。
  • 你说得对,我应该这样做,但既然我解决了问题,我认为这不再是必要的了。无论如何,感谢您对它的兴趣。 :D
  • 如果您自己解决了,您应该在下面发布您的解决方案。

标签: ruby-on-rails rails-activerecord arel


【解决方案1】:

试试下面的代码。它检查用户在问题的参数中是否有任何答案。我想这也是你打算做的-

def selected_by(answerer)
  answers =    
    Answer.where(answerer_id: answerer.id, answerer_type:answerer.type, id_option: self.id)

  answers.exists?
end

【讨论】:

  • 在查询结束时使用exists? 可能比保存到变量并调用present? 更高效。也可以只使用.where(answerer: answerer),Rails 魔术会比较那里的类型和 id。然后是最后的唠叨,因为你期待一个布尔值,所以约定使用谓词方法,即def selected_by?(answerer)
  • 您从加载单个数据库记录到查询所有记录而不对它们执行任何操作,如@Int'lManOfCodingMystery 所述,最好的改进是使用exists? 如果您不需要访问任何记录的列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多