Rails:返回至少有一个关联符合条件的不同对象

时间:2016-10-18 16:55:04

标签: ruby-on-rails rails-activerecord

好的,我有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进行尝试时,它们会返回不同的值:

enter image description here

1 个答案:

答案 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 }