如何在Rails中查询具有一对一关联的模型

时间:2017-02-18 10:54:58

标签: ruby-on-rails

我想找到next_review在当前时间Time.zone.now之前的所有卡(属于用户)。

以下是我的模式,

enter image description here

期待行为

我应该将finder方法保留在相应的模型中,

class User < ActiveRecord::Base
  has_many :cards
  def next_cards
    cards.next_cards
  end
end

class Card < ActiveRecord::Base
  has_one :meta
  def next_cards
    # what should I write here?
  end
end

class Meta < ActiveRecord::Base
  belongs_to :card
  # what should I write here?
end

我在想什么

  1. 查询元表,其中(next_repetition&lt; today)在meta模型中并获取所有目标元
  2. 将结果加入(1)卡表,找到card模型
  3. 中的目标卡片
  4. 返回user型号
  5. 内的目标卡片

1 个答案:

答案 0 :(得分:1)

user.cards.joins(:meta).where('metas.next_review_date <= ?', Time.zone.now)

<强> 更新

class User < ActiveRecord::Base
  has_many :cards
  def next_cards
    cards.next
  end
end

class Card < ActiveRecord::Base
  has_one :meta
  scope :next, -> { joins(:meta).merge(Meta.next) }
end

class Meta < ActiveRecord::Base
  belongs_to :card
  scope :next, -> { where('next_review_date <= ? ', Time.zone.now) }
end

然后

user.next_cards

只会退回属于用户的卡片,并且会返回带有review_date&lt; = now

的元素的卡片

这将只执行1个查询,而不是您在帖子中建议的2-3个查询。