我一直在阅读以了解最好的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
我需要的是: “在给定日期内,与给定捐赠者类别相关的所有捐赠” 日期标准适用于捐赠,但捐赠者类别标准适用于捐赠者 所以我好像需要过滤应用于捐赠查询的捐赠者。
答案 0 :(得分:2)
您可以向Donor添加有用的查询方法。在DonationCategory上添加has_many ... through
可以让您轻松访问给定类别的捐赠,自动加入表格,如下所示:
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
上的has_many
选项,您根本不需要修改数据库。 Rails将通过加入您的捐款,捐赠者和捐赠者类别表来获取来自donor_category donations
的{{1}}。
你提到了范围。 donors
类方法实际上是一个范围。 within_dates
只是special rails syntax,用于创建查询数据库的类方法。这是一种冗余机制,但是DHH likes it。我同意,通常范围比同等的类方法更容易在眼睛上,但是当范围需要参数时,就像在这里一样,我认为类方法实际上更直接。
<强>更新强>
RFC1337的回答让我意识到查询方法可以简化:
scope
答案 1 :(得分:0)
我认为你需要的是这样的:
Donor.where(:donor_category => DonorCategory.find(id)).where(:date => start_date..end_date)