0

问题

下面我给出了我当前的 API 结果,但是,鉴于执行的 SQL 不是我的预期或期望结果。谁能帮助我获得第二个 SQL 查询结果而不是第一个?

楷模

控制台游戏.rb

class ConsoleGame < ActiveRecord::Base
    self.table_name = 'console_game'
    self.primary_key = :id

    has_many :configurations, :class_name => 'Configuration'
end

配置.rb

class Configuration < ActiveRecord::Base
    self.table_name = 'configuration'
    self.primary_key = :id
end

API

resource :configuration do
  desc "Finds all configurations associated with a game."
  params do
    requires :game, type: String, desc: "Game search.", documentation: { example: 'Battlefield 3' }
  end
  route_param :game do
    get do
      ConsoleGame.where(value: 'Battlefield 3').includes(:configurations)
    end
  end
end

调试控制台

D,[2014-05-06T15:11:59.071493 #31068] 调试——:控制台游戏负载(0.4 毫秒)选择console_game.* 从console_game 哪里console_gamevalue=“战地 3”D,[2014-05-06T15:11:59.073289 #31068] 调试 -- :配置加载(0.3 毫秒)选择configuration.* 从configuration 哪里configurationconsole_game_idIN (2) 127.0.0.1 - - [06/May/2014 15:12:08] “GET /configuration/game HTTP/1.1”200 34 25.9740

结果 - 获取 /configuration/game

[
    {
        id: 2,
        value: "Battlefield 3"
    }
]

期望的结果 - 获取 /configuration/game

[
    {
        id: 2,
        value: "x",
        device: 4,
        system: null,
        console_game_id: 2,
        creator: "yrdy",
        created_date: null,
        positive_votes: 0,
        negative_votes: 0
    },
    {
        id: 4,
        value: "ffds",
        system: 2,
        console_game_id: 2,
        creator: "gdfs",
        created_date: null,
        positive_votes: 0,
        negative_votes: 0
    }
]

注意:这张表上有很多外国索引,我想解决它们,但也许那是另一天。

的结果ConsoleGame.where(value: 'Battlefield 3').includes(:configurations).as_json(include: :configurations)

[
    {
        id: 2,
        value: "Battlefield 3",
        configurations: [
            {
                id: 2,
                value: "ffds",
                device: 4,
                system: null,
                console_game_id: 2,
                creator: "yrdy",
                created_date: null,
                positive_votes: 0,
                negative_votes: 0
            },
            {
                id: 4,
                value: "x",
                device: 4,
                system: 2,
                console_game_id: 2,
                creator: "gdfs",
                created_date: null,
                positive_votes: 0,
                negative_votes: 0
            }
        ]
    }
]
4

1 回答 1

1

这行得通吗?

class ConsoleGame < ActiveRecord::Base
  #self.table_name = 'console_game'
  #self.primary_key = :id

  has_many :configurations #, :class_name => 'Configuration'
end

class Configuration < ActiveRecord::Base
  #self.table_name = 'configuration'
  #self.primary_key = :id
  belongs_to :console_game #, class_name: "ConsoleGame", primary_key: 'console_game_id', foreign_key: 'id'  #added relationship for ConsoleGame
end

resource :configuration do
  desc "Finds all configurations associated with a game."
    params do
      requires :game, type: String, desc: "Game search.", documentation: { example: 'Battlefield 3' }
    end
    route_param :game do
      get do
        #Search Configurations based on console game
        Configuration.joins(:console_game).where(console_game:{value: 'Battlefield 3'})
      end
    end
end

更好的是添加一个范围

class Configuration < ActiveRecord::Base
  #self.table_name = 'configuration'
  #self.primary_key = :id
  belongs_to :console_game #, class_name: "ConsoleGame", primary_key: 'console_game_id', foreign_key: 'id'  #added relationship for ConsoleGame
  scope :by_game,->(game){
           #verbosely
           #game_ids = ConsoleGame.where(value: game).pluck(:id)
           #where(console_game_id: game_ids)
           #one line
           joins(:console_game).where(console_game:{value: game})
           }
end    

用于

Configuration.by_game('Battlefield 3')

编辑

我已经注释掉了不需要的行,因为它们是设计所暗示的

于 2014-05-06T19:47:41.227 回答