2013-03-15 130 views
1

我已經實現它的方式,它不會出現。我可以將兩個連接資源連接在一起嗎?

在data_mapper方面 - 我有一個連接資源條目,即連接驅動程序,團隊和季節

我有加入田徑賽季

聯接資源一場比賽,我有一個連接入口聯接資源配售和種族。

當我嘗試做一些像「給我所有的比賽,一個特定條目已經參加了與類似

@entry_a.races.all 

我得到這個錯誤

DataObjects::SyntaxError: no such column: INNER (code: 1, sql state: , query: SELECT "races"."track_id", "races"."season _id", "races"."race_no" FROM "races" INNER JOIN "placings" ON INNER JOIN "entries" ON "placings"."entry_team_id" = "ent ries"."team_id" AND "placings"."entry_driver_id" = "entries"."driver_id" WHERE ("placings"."entry_team_id" = 'FER' AND " placings"."entry_driver_id" = 'MAS') GROUP BY "races"."track_id", "races"."season_id", "races"."race_no" ORDER BY "races "."track_id", "races"."season_id", uri: sqlite3:C/devProjects/formula1../spec/resources/test.db?scheme=sqlite3&user=&pas sword=&host=C&port=&query=&fragment=&adapter=sqlite3&path=/devProjects/formula1../spec/resources/test.db)

它很容易的看看這裏發生了什麼,用.all方法包裝的查詢不會期望加入連接

我設法通過編寫一些自定義sql來解決這個問題雖然不理想,它確實完成了這項工作。它似乎並不是紅寶石般的方式。也許我的數據庫架構很糟糕?

這裏是我的模型(關於代碼轉儲抱歉。我已經得到了由傢伙那麼,誰決定downvote我燒了,因爲我還沒有完整引述代碼)

require "rubygems" 
require "sqlite3" 
require "data_mapper" 
require "bigdecimal" 

#note that Dir.pwd refers to the location of the file that calls 
if ENV["run_mode"] == "prod" 
    DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/data/prod.db") 
else 
    DataMapper::setup(:default, "sqlite3://#{Dir.pwd}../spec/resources/test.db") 
end 

class Entry 

    include DataMapper::Resource 

    belongs_to :team, :key => true 
    belongs_to :driver, :key => true 
    belongs_to :season, :key => true 

    has n, :placings 
    has n, :races, :through => :placings 

    def find_races 

     return repository.adapter.select('SELECT races.track_id, races.season_id, races.race_no FROM races INNER JOIN placings ON races.track_id = placings.race_track_id INNER JOIN entries ON placings.entry_driver_id = entries.driver_id WHERE (entries.team_id = ? AND entries.driver_id = ?)', self[:team_id], self[:driver_id]) 

    end 

end 

class Track 

    include DataMapper::Resource 

    property :id, String, :key => true 

    has n, :races 

end 

class Race 

    include DataMapper::Resource 

    property :race_no, Integer 

    belongs_to :track, :key => true 
    belongs_to :season, :key => true 

    has n, :placings 
    has n, :entries, :through => :placings 


end 

class Placing 

    include DataMapper::Resource 

    property :id, Serial #put this in because dm was complaining that foreign keys from entry object were not unique 
    belongs_to :race  
    belongs_to :entry 

end 

class Season 

    include DataMapper::Resource 
    property :id, Integer, :key => true 

    has n, :races 
    has n, :entries 

end 

class Driver 

    include DataMapper::Resource 
    property :id, String, :key => true 
    property :team, String 
    property :ptd, Integer 
    property :races, Integer 
    property :grid, Object 
    property :race, Object 
    property :cumulativePoints, Object #the number of points accumulated at a particular point in the season 
    property :hcScore, Integer 
    property :domScore, Integer 
    property :nation, String 
    property :wins, Integer 
    property :podiums, Integer 

    has n, :entries 
    has n, :teams, :through => :entries 

end 

class Team 
    include DataMapper::Resource 
    property :id, String, :key => true 
    property :name, String 
    property :ptd, Integer 
    property :domScore, Integer 
    property :nation, String 

    has n, :entries 
    has n, :drivers, :through => :entries 

    def initialize(team_id) 
     self[:id] = team_id 
     self.save! 
    end 

    def add_driver(driver_id) 
     @driver = Driver.create(:id => driver_id) 
     Entry.create(:driver => (Driver.get driver_id), :team => self, :season => Season.last) 
     return @driver 
    end 

end 

class Nation 
    include DataMapper::Resource 
    property :id, String, :key => true 
    property :ptd, Integer 
    # could possibly have the drivers, teams and engines here as well 
end 

if ENV["run_mode"] == "test" 
    DataMapper.finalize.auto_migrate! 
else 
    DataMapper.finalize.auto_upgrade! 
end 

回答

1

一些測試後,我想你看到的錯誤與組合鍵有關;嘗試更改Race的單個串行密鑰。我認爲這是DM中的一個錯誤。

我不得不嘗試做Driver.first.races複合主鍵時同樣的錯誤出現,但只有一個序列鍵,它的工作:

$KCODE='u' 

require 'rubygems' 
require 'dm-core' 
require 'dm-migrations' 

DataMapper::Logger.new($stdout, :debug) 
DataMapper.setup(:default, "sqlite::memory:") 

class Entry 
    include DataMapper::Resource 
    #property :id, Serial # maybe also here? Although everything seems to work without 
    property :grid, Integer 
    property :position, Integer 
    belongs_to :driver, :key => true 
    belongs_to :race, :key => true 
end 

class Driver 
    include DataMapper::Resource 
    property :name, String, :key => true 
    has n, :entries 
    has n, :races, :through => :entries 
    def podiums; entries(:position => (1..3)) end 
    def wins; entries(:position => 1) end 
end 

class Race 
    include DataMapper::Resource 
    property :id, Serial 
    belongs_to :track 
    belongs_to :season 
    has n, :entries 
    has n, :drivers, :through => :entries 
end 

class Season 
    include DataMapper::Resource 
    property :year, Integer, :key => true 
    has n, :races 
end 

class Track 
    include DataMapper::Resource 
    property :name, String, :key => true 
    has n, :races 
end 

DataMapper.finalize.auto_migrate! 

Entry.create(
    :driver => Driver.new(:name => "Kimi Räikkönen"), 
    :grid => 7, :position => 1, 
    :race => Race.new(
    :track => Track.new(:name => "Albert Park"), 
    :season => Season.new(:year => 2013))) 
+0

感謝您尋找到它和neatening了我的代碼的其他部分!而最新的例子:)去冰人:) – JoeyC 2013-03-21 08:08:57

相關問題