注:私は問題を解決するためにこの方法を見つけました。中国からの優しさ。
RailsAdminを持っている場合、両方の質問フィールド(assumption_question_id、consequent_question_id)の1つのフィールドが質問のidと等しい限り、1つの質問のすべてのルールを表示できることに気付くかもしれません。
これについて詳細なテストを行ったところ、Railsは常にto_sql出力を行う条件「question_id=[current_id]」を生成することがわかりました。
SELECT `rules`.* FROM `rules` WHERE `rules`.`question_id` = 170
そして、次のモデルが
class Question < ActiveRecord::Base
has_many :options
# Notice ↓
has_many :rules, ->(question) { where("assumption_question_id = ? OR consequent_question_id = ?", question.id, question.id) }, class_name: 'Rule'
# Notice ↑
end
Question.take.rules.to_sqlを次のようにします
SELECT `rules`.* FROM `rules` WHERE `rules`.`question_id` = 170 AND (assumption_question_id = 170 OR consequent_question_id = 170)
私たちはまだ煩わしさを乗り越えていないquestion_id
ので、どのように適切に説明または調整しても、私たちの条件はその「AND」に従います。
次に、それに乗る必要があります。どうやって?
ここをクリックすると、その方法がわかります。セクター8.1を検索すると、次のように表示されます。
Article.where(id: 10, trashed: false).unscope(where: :id)
# SELECT "articles".* FROM "articles" WHERE trashed = 0
それからそれをしましょう:
class Question < ActiveRecord::Base
has_many :options
# Notice ↓
has_many :rules, ->(question) { unscope(where: :question_id).where("assumption_question_id = ? OR consequent_question_id = ?", question.id, question.id) }, class_name: 'Rule'
# Notice ↑
end
class Rule < ActiveRecord::Base
belongs_to :option
belongs_to :assumption_question, class_name: "Question", foreign_key: :assumption_question_id, inverse_of: :assumption_rules
belongs_to :consequent_question, class_name: "Question", foreign_key: :consequent_question_id, inverse_of: :consequent_rules
end
class Option < ActiveRecord::Base
belongs_to :question
has_one :rule
end
全部終わった。
ついに
これはstackoverflowでの私の最初の答えであり、このメソッドは他のどこにも見つかりません。
読んでくれてありがとう。