好的,我有3张桌子:
lessons
:其中包含许多new_words new_words
:属于课程,并且有一个word_type
列(Verb Adj Noun .etc)verb_forms
:
word_type = Verb
的新单词都会与verb_form
相关联。verb_forms
有一列verb_type
,表示动词的类型(1,2或3)现在,我想查询至少有Verb
verb_type = 1
到目前为止,我已将此归档:
class VerbForm < ApplicationRecord
belongs_to :new_word
scope :first_type, -> { where(verb_type: 1) }
end
class NewWord < ApplicationRecord
has_one :verb_form, dependent: :destroy, inverse_of: :new_word
scope :ftv, -> { verbs.joins(:verb_form).merge(VerbForm.first_type) }
end
class Lesson < ApplicationRecord
has_many :new_words
scope :with_ftvs, -> { joins(:new_words).merge(NewWord.ftv) }
end
现在,如果我运行Lesson.with_ftvs
,每节课将多次出现,具体取决于该课程中第一类动词的数量(例如,如果第1课中有3个第一类动词,那么{{ 1}}在上面的查询中返回3次)
那么,我怎样才能获得不同的课程列表?,我尝试了这个查询,但它返回了nil?
lesson 1
p / s:我一直认为 scope :with_ftvs, -> { joins(:new_words).merge(NewWord.ftv).distinct }
和count
是一样的。但是,当我使用原始查询length
vs Lesson.with_ftvs.count
进行尝试时,它们会返回不同的值:
答案 0 :(得分:0)
在SQL连接中,可能会返回重复的结果,因此您应该使用distinct或group by some column。
scope :with_ftvs, -> { joins(:new_words).merge(NewWord.ftv).group("lessons.id") }
# or
scope :with_ftvs, -> { joins(:new_words).merge(NewWord.ftv).distinct }