1

私の最新のRailsアプリには、これらの3つのモデルがあります - EntriesPoliticianおよびParties。このアプリは単に「政治家」の「エントリ」を追加するためのものです。エントリに (エントリname, date) があると仮定します。政治家の政党はメンバーシップ モデルを使用して記録され、各メンバーシップの時間枠も記録されます。したがって、メンバーシップのレコードは次のようになります。

politician_id, party_id, date_from, date_to 

モデル

class Politician < ActiveRecord::Base
  has_many :memberships
  has_many :parties, :through => :memberships do
  has_many :entries
end

class Party < ActiveRecord::Base
  has_many :memberships
  has_many :politicians, :through => :memberships
end

class Membership < ActiveRecord::Base
  belongs_to :politician
  belongs_to :party
end

ここで、テーブルに ID 148 の政治家のエントリ レコードがあり、両方のテーブルの日付に基づいて、このエントリのこの政治家の党員"148","My entry name", "2010-01-25"を見つける必要があるとします。メンバーシップ テーブルにこれらのレコードがあると仮定します。ここで使用する必要があるスコープだと思いますか?

politician_id | party_id | date_from | date_to 

148 | 10 | 2012-01-22 | 2013-01-22
148 | 16 | 2010-01-21 | 2012-01-21
148 | 45 | 2009-01-19 | 2010-01-20
4

1 に答える 1

1

チェーンスコープを使用してこの方法をお勧めします。これはあなたのために機能し、将来的にはより柔軟になります

名前で検索する範囲を政治家に追加します。

scope :by_name, lambda{|name| name: name }

次に、メンバーシップ モデルにスコープを追加して、範囲に適合するすべてのメンバーシップのリストを検索します

scope :by_date, lamda{|x,y| where("date_from > ? and date_to < ?, x,y) }

これにより、次のようなことが言えます

Party.memeberships.by_date(YOURFROMDATE, YOURTODATE).by_name(YOURPOLITICIAN)

これらはこれを行うためのいくつかの方法ですが、私は将来的に再利用するための単純なスコープが好きです。1 つのスコープだけですべてを行うことは可能ですが」

于 2013-01-21T13:52:56.033 に答える