(Rails 3) Объединить два запроса в один - PullRequest
1 голос
/ 21 декабря 2010

У меня упрощены эти модели:

class Game::Champ < ActiveRecord::Base
  has_one :contract, :class_name => "Game::ChampTeamContract", :dependent => :destroy
  has_one :team, :through => :contract
  # Attributes: :avg => integer
end
#
class Game::Team < ActiveRecord::Base
  has_many :contracts, :class_name => "Game::ChampTeamContract", :dependent => :destroy
  has_many :champs, :through => :contracts
end
#
class Game::ChampTeamContract < ActiveRecord::Base
  belongs_to :champ
  belongs_to :team
  # Attributes: :expired => bool, :under_negotiation => bool
end
#

Итак, я хочу найти все Game :: Champs, которые не имеют Game :: ChampTeamContract, независимо от того, что ИЛИ имеет,но (это не : under_negociation ИЛИ: expired), отсортировано по Champ.avg ASC

Я как бы застрял при использовании двух запросов, суммировании результата и его сортировке.Я хотел бы, чтобы был лучший способ сделать это более "Railish"

ОБНОВЛЕНИЕ: Только что добавил ограничение о: expired

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Попробуйте что-то вроде:

Game::Champs.
  joins("left outer join game_champ_team_contracts on game_champ_team_contracts.champ_id = game_champs.id").
  where("game_champ_team_contracts.id is null or (game_champ_team_contracts.state != ? or game_champ_team_contracts.state = ?)", :under_negotiation, :expired).
  order("game_champs.avg ASC")

Это довольно неприятная строка, если оставить ее как есть, поэтому, если вы ее используете, ее нужно привести в порядок.Используйте области или методы, чтобы разделить это как можно больше!

1 голос
/ 21 декабря 2010

Я только что проверил с супер простым запросом:

@bars1 = Bar.where(:something => 1)
@bars2 = Bar.where(:something => 2)

@bars = @bars1 + @bars2

Не уверен, что это правильно, но работает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...