class Question < ApplicationRecord
has_many :question_articles
has_many :articles, through: :question_articles
end
class Article < ApplicationRecord
has_many :question_articles
has_many :questions, through: :question_articles
end
class QuestionArticle < ApplicationRecord
belongs_to :article
belongs_to :question
end
question_articles表包含 2 列:user_usages_count和admin_usages_count。
我需要檢索questions按question_articles.user_usages_count 排序question_articles.admin_usages_count
我試過了:
Question
.joins(:articles)
.includes(:question_articles)
.order('question_articles.admin_usages_count question_articles.user_usages_count DESC')
但我得到 'disallow_raw_sql!': Query method called with non-attribute argument
uj5u.com熱心網友回復:
要解決這個問題,'disallow_raw_sql!': Query method called with non-attribute argument我們需要使用內置Arel.sql方法
所以作業的解決方案是
Question
.joins(:articles)
.includes(:question_articles)
.order(Arel.sql('question_articles.admin_usages_count question_articles.user_usages_count DESC'))
uj5u.com熱心網友回復:
您應該能夠完全避免參考 SQL 并將您的邏輯保留在 ruby?? 中,方法是在您的 Question 模型中創建一個看起來像這樣的方法(假設您需要所有相關QuestionArticle記錄中這兩個欄位的總和)。
def self.by_usage
all.sort_by do |_question|
_question.question_articles.reduce(0) { |_sum, _qa| _sum = (_qa.user_usages_count _qa.admin_usages_count) }
end
end
然后,您應該能夠使用@questions.by_usage和取回按每個問題的相關 QuestionArticle 記錄中所有使用次數的總數排序的問題記錄。
假設這滿足您的需求,您可以通過向 QuestionArticles 模型添加一個方法來進一步整理它,該方法回傳這兩個欄位的總和:
def total_usage
user_usages_count admin_usages_count
end
reduce然后該行將簡化為:
_question.question_articles.reduce(0) { |_sum, _qa| _sum = _qa.total_usage }
其本身簡化為:
_question.question_articles.reduce(&:total_usage)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/329020.html
