Fetch Rails根据连接表中的条件连接模型记录

时间:2012-02-17 20:26:46

标签: ruby-on-rails associations has-many-through has-many scopes

我想知道是否有一种“正确的”Rails(3.1)方法,而不使用finder SQL就可以做到这一点。

我有一个STI层次结构:

class Party
class Person < Party
class Organisation < Party

关联方通过party_relationships表和模型加入,使用外键party_id和related_pa​​rty_id

我希望能够做到这一点:

class Party
  # Should return all party_relationships where the related_party is a Person
  has_many :person_relationships

  # Should return all party_relationships where the related_party is an Organisation
  has_many :organisation_relationships
end

在Rails 3.1中执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

解决了它。这是有效的,我不得不说我对非常对范围和关系的工作方式印象深刻:

class Party
  has_many :party_relationships, foreign_key: :party_id
end

class PartyRelationship
  belongs_to :related_party, :class_name => 'Party'
  scope :to_organisations, :joins => :related_party, :conditions => {:parties => {:type => 'Organisation' } }
end

现在如果我参加派对......

@party.party_relationships                   # <- returns all relationships
@party.party_relationships.to_organisations  # <- Only those where related_party is an organisation

真正喜欢的是,如果我在has_many上使用了:finder_sql,那么SQL将在Party类中。这样可以保持正确封装的内容,以便Party不必知道如何实现范围。整齐。