Rails has_many:通过STI

时间:2013-11-27 14:56:31

标签: ruby-on-rails activerecord

让我们从代码开始:

class User < ActiveRecord::Base
  has_many :photos
  has_many :submitted_photos
  has_many :posted_photos

  has_many :handshakes, through: :photos
end

class Photo < ActiveRecord::Base
  belongs_to :user
end

class PostedPhoto < Photo
  has_many :handshakes, inverse_of: :poster, foreign_key: 'poster_id'
end

class SubmittedPhoto < Photo
  has_many :handshakes, inverse_of: :submitter, foreign_key: 'submitter_id'
end

class Handshake < ActiveRecord::Base
  belongs_to :submitter, class_name: 'SubmittedPhoto'
  belongs_to :poster,    class_name: 'PostedPhoto'
end

STI部分以及照片和握手之间的关联工作正常。问题是让所有用户通过他的照片握手。

使用上面的代码Rails显然会抱怨模型Photo没有名为handshakes的关联。 AR中是否有任何设施允许我指定这种关系?如果没有,你会写什么查询来获取它们?

2 个答案:

答案 0 :(得分:1)

您可以在User中使用:

has_many :submitted_handshakes, through: :submitted_photos, source: :handshakes
has_many :posted_handshakes, through: :posted_photos, source: :handshakes

我知道这可以像你一样工作:

user.submitted_handshakes ----> user.submitted_photos.handshakes

显然握手方法在submitted_photos中不存在,但是AR通过连接表格为你做了这个。

答案 1 :(得分:0)

我最终使用以下代码,看起来是解决此问题的最简单方法。

class User
  def handshakes
    Handshake.where('submitter_id IN (?) OR poster_id IN (?)', submitted_photo_ids, posted_photo_ids)
  end
end