您可以向 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 将通过加入您的捐赠、捐赠者和捐赠者类别表donations
从捐赠者类别中获取。donors
你提到了范围。类within_dates
方法实际上是一个作用域。scope
只是用于创建查询数据库的类方法的特殊 rails 语法。这是一种冗余机制,但DHH 喜欢它。而且我同意范围通常比等效的类方法更容易看,但是当范围需要参数时,就像在这里一样,我认为类方法实际上更简单。
更新
RFC1337的回答让我意识到查询方法可以简化:
def self.within_dates(start_date, end_date)
where created_at: start_date..end_date
end