我实施它的方式似乎不是。
在data_mapper术语中 - 我有一个加入资源条目,它加入了Driver,Team和Season
我有一个加入Track and Season的加入资源Race
我有一个加入资源Placing加入Entry和Race。
当我尝试做某些事情时“向我展示一个特定参赛作品参与的所有比赛
@entry_a.races.all
我收到此错误
DataObjects :: SyntaxError:没有这样的列:INNER(代码:1,sql state :, query:SELECT“races”。“track_id”,“races”。“season _id“,”比赛“。”race_no“FROM”比赛“INNER JOIN”位置“ON INNER JOIN”条目“ON”位置“。”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”种族 “。”track_id“,”races“。”season_id“,uri:sqlite3:C / devProjects / formula1 ../ spec / resources / test.db?scheme = sqlite3& user =& pas 剑=安培;主机= C&安培;端口=安培;查询=安培;片段=安培;适配器= sqlite3的&安培;路径= / devProjects /一级方程式../规格/资源/ test.db的)
很容易看到这里发生的事情,.all方法包装的查询不期望加入连接。
我设法通过编写一些自定义sql来解决这个问题。虽然不理想,但它确实能够胜任。它似乎不是红宝石的方式。也许我的db架构糟透了?
这是我的模型(对于代码转储感到抱歉。我已经被一个SO的同事烧死了,因为我没有引用完整的代码而决定投票给我)
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
答案 0 :(得分:1)
经过一些测试后,我认为你看到的错误与复合键有关;尝试更改Race的单个Serial键。我认为这是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)))