2

私には 2 つのモデルがfooありbar、 にfooは多くの がありbarsます。

Barは一定期間発生するイベントなので、ActiveRecord::Relation現在アクティブなバーを持つ foo を表す を返すメソッドまたはスコープが必要です。

Fooこれは、スコープを持つクラスでは簡単です。

class Foo < ActiveRecord::Base
has_many :bars

scope :has_current_bars, joins(:bars).where('bar.foo_id IS NOT NULL').where('bar.starts_at <= ?', DateTime.now).where('bar.ends_at >= ?', DateTime.now)

これについて私が気に入らないのはfoo、 の内部について非常に多くのことを知る必要があるということですbar

おそらく にスコープを追加することで、これを書き直すことができるbarので、属性fooについて知る必要はありませんか?bar

4

3 に答える 3

1

絶対。スコープを に移動できますし、移動する必要がありますBar

class Bar < ActiveRecord::Base
  belongs_to :foo

  scope :current, where('starts_at <= ? AND ends_at >= ?', DateTime.now, DateTime.now)
end

foo = Foo.first
foo.bars.current # Will return all of foo's bars which match the scope

# EDIT:
bars.current.map(&:foo) # Will return all foos that have current bars
于 2011-01-20T03:07:39.587 に答える
0
class Foo < ActiveRecord::Base
  has_many :bars

  def self.has_current_bars
    joins(:bars).merge(Bar.current)
  end

  # or
  scope :has_current_bars, joins(:bars).merge(Bar.current)
end

class Bar < ActiveRecord::Base
  scope :current, where('bar.starts_at <= ?', DateTime.now).where('bar.ends_at >= ?', DateTime.now)
end

foos = Foo.has_current_bars
于 2013-08-28T01:23:05.593 に答える