Как вернуть отношение ActiveRecord через две другие ассоциации has_many - PullRequest
2 голосов
/ 27 августа 2011

Модель:

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 вернет массив уникальных объектов, как я хочу. Но мне нужно использовать что-то вроде User.first.stories.where("title = 'foo'"), которое возвращает ошибку, потому что это массив, а не отношение.

Так, что я могу сделать, чтобы получить те же самые результаты через отношения, позволяющие использовать с Arel?

PS .: Im on Rails 3.1.rc6

Ответы [ 2 ]

1 голос
/ 27 августа 2011
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
0 голосов
/ 27 августа 2011

Только область возвращает отношение. Преобразование метода в область видимости 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...