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 ... throughon 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)

要使用throughon 选项has_many,您根本不需要修改数据库。Rails 将通过加入您的捐赠、捐赠者和捐赠者类别表donations从捐赠者类别中获取。donors

你提到了范围。类within_dates方法实际上是一个作用域。scope只是用于创建查询数据库的类方法的特殊 rails 语法。这是一种冗余机制,但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 回答