1

以下を行うためのRails 3の最良の方法を理解するために読んでいます。提案されたアプローチに非常に感謝しています。(スコープ?)

私は次のモデルを持っています:

class DonorCategory < ActiveRecord::Base
  has_many :donors
end

class Donor < ActiveRecord::Base
  has_many :donations
  belongs_to :donor_category
end

class Donation < ActiveRecord::Base
  belongs_to :donor
end

私が必要とするのはこれです:「特定の日付の特定のドナーカテゴリに関連付けられたすべての寄付」日付基準は寄付に適用されますが、ドナーカテゴリ基準はドナーに適用されますしたがって、ドナーをフィルタリングする必要があるかのようです寄付クエリに適用されます。

4

2 に答える 2

2

役立つクエリ メソッドを Donor に追加できます。has_many ... throughまた、 on DonationCategory を追加すると、特定のカテゴリの寄付に簡単にアクセスでき、次のようにテーブルが自動的に結合されます。

class DonationCategory < ActiveRecord::Base
    has_many :donors
    has_many :donations, through: :donors
end

class Donation < ActiveRecord::Base

  def self.within_dates(start_date, end_date)
    where "created_at >= ? AND created_at <= ?", start_date, end_date
  end

end

# Query looks like this:
some_category.donations.within_dates(start_date, end_date)

# Or this:
DonorCategory.find(123).donations.within_dates(start_date, end_date)

throughオプションを onで使用するためhas_manyに、データベースを変更する必要はまったくありません。Rails は、寄付、寄付者、およびdonor_categories テーブルを結合することによりdonations、donor_category からを取得します。donors

あなたはスコープについて言及しました。クラス メソッドはwithin_dates実質的にスコープです。データベースにクエリを実行するクラス メソッドを作成するための特殊な Rails 構文scopeです。これは冗長なメカニズムですが、DHH は気に入っています。また、同等のクラス メソッドよりもスコープの方が見やすいことが多いことに同意しますが、ここでのようにスコープに引数が必要な場合は、実際にはクラス メソッドの方が簡単だと思います。

アップデート

RFC1337 の回答により、クエリ メソッドを簡略化できることがわかりました。

def self.within_dates(start_date, end_date)
  where created_at: start_date..end_date
end
于 2012-05-16T13:47:14.107 に答える
0

必要なのは次のようなものだと思います。

Donor.where(:donor_category => DonorCategory.find(id)).where(:date => start_date..end_date)
于 2012-05-16T14:20:12.260 に答える