开发者

(Rails 3) Combine two queries into one

开发者 https://www.devze.com 2023-01-31 11:12 出处:网络
I have these models simplified: class Game::Champ < ActiveRecord::Base has_one :contract, :class_name => \"Game::ChampTeamContract\", :dependent => :destroy

I have these models simplified:

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
#

So what I want to do here is to find all Game::Champs that have no Game::ChampTeamContract whatsoever OR has, but (is not :under_negociation OR is :expired ), sorted by Champ.avg ASC

I am kinda stuck at using two queries, concating the result and sorting it. I wish there were a better way to to it more "Railish"

UPDATE: Just added a constraint about :expired


Try something like:

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")

This is a fairly nasty line if left as-is, so if you use this, it needs tidying up. Use scopes or methods to split it up as much as possible!


I just tested with a super simple query:

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

@bars = @bars1 + @bars2

Not sure if it's right, but it works...

0

精彩评论

暂无评论...
验证码 换一张
取 消