Rails 3多级连接

时间:2012-05-16 13:38:33

标签: ruby-on-rails ruby-on-rails-3 activerecord

我一直在阅读以了解最好的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

我需要的是: “在给定日期内,与给定捐赠者类别相关的所有捐赠” 日期标准适用于捐赠,但捐赠者类别标准适用于捐赠者 所以我好像需要过滤应用于捐赠查询的捐赠者。

2 个答案:

答案 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)