如何通过另外两个has_many关联返回ActiveRecord关系

时间:2011-08-27 05:31:25

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

型号:

class User < ActiveRecord::Base
  has_many :requests, class_name: 'Story', foreign_key: 'requester_id'
  has_many :ownerships, class_name: 'Story', foreign_key: 'owner_id'

  def stories
    requests | ownerships
  end
end

在这种情况下,方法stories将根据需要返回uniq对象的数组。但我需要使用类似User.first.stories.where("title = 'foo'")的东西来返回错误,因为它是一个数组,而不是关系。

那么我可以通过允许与Arel一起使用的关系来获得相同的结果呢?

PS:我在Rails 3.1.rc6

2 个答案:

答案 0 :(得分:1)

class User < ActiveRecord::Base
  def stories
    Story.where "(owner_id = :id) OR (requester_id = :id)", :id => id
  end
end

或者如果你使用squeel

,这可以写得更好
def stories
  Story.where { (owner_id == my{id}) | (requester_id == my{id}) }
end

答案 1 :(得分:0)

只有范围才会返回关系。将方法转换为LOJ范围应该有助于我猜测。

scope :stories, select('stories.*').joins('LEFT OUTER JOIN stories ON 
users.id = stories.requester_id LEFT OUTER JOIN stories ON users.id = stories.owner_id')