我有几个型号:
class StatsParent < ActiveRecord::Base
class CourseStat < StatsParent
class PlayerCourseStat < CourseStat
我已将Course
模型设置为:
class Course < ActiveRecord::Base
has_one :course_stat
has_many :player_course_stats
def update_stats(plyr_rnd)
puts self.course_stat # this puts #<PlayerCourseStat:0x000001015c54e0>
if self.course_stat
self.course_stat.add_player_round(plyr_rnd)
else
self.course_stat = CourseStat.new(plyr_rnd)
end
end
#...rest of the class
我遇到的问题:在课程中,我检查course_stat
是否存在以及是否不创建它。但是在模型中它表示存在是因为存在与此实例关联的player_course_stat
。
当我深入ruby script/console
并查看course_stat
关系时,它是零。
> ruby script/console
Loading development environment (Rails 2.3.3)
>> course = Course.find(1)
=> #<Course id: ...>
>> course.course_stat
=> nil
>> course.player_course_stats
=> [#<PlayerCourseStat id: 1, ...>]
course_stat
在控制台中没有,但在应用程序中没有,因为它正在运行?更新
进一步研究一下,我查看了日志,以获取为控制台和应用程序生成的SQL语句。
# from console: course.course_stat
CourseStat Load (0.2ms) SELECT * FROM "stats_parents" WHERE
("stats_parents".course_id = 1) AND ( ("stats_parents"."type" = 'CourseStat' ) )
LIMIT 1
# from app: course.course_stat
CourseStat Load (0.3ms) SELECT * FROM "stats_parents" WHERE
("stats_parents".course_id = 3) AND ( ("stats_parents"."type" = 'CourseStat' OR
"stats_parents"."type" = 'PlayerCourseStat' ) )
LIMIT 1
我想要使用控制台创建的查询。有没有办法让我这样做而不必完全写出sql?
答案 0 :(得分:1)
我认为你应该简单地为你的has_one
添加一个条件has_one :course_stat, :conditions => "type = 'CourseStat'"
这似乎是多余的,但我发现控制台和应用程序之间的不一致非常令人困惑......
答案 1 :(得分:1)
如果你想保持这个简单(这总是一个好主意),消除继承并将共享逻辑放在模块中
module Stats
def ...
end
class CourseStat < ActiveRecord::Base
include Stats
end
class PlayerCourseStat < ActiveRecord::Base
include Stats
end
答案 2 :(得分:0)
鉴于你的关系:
class StatsParent < ActiveRecord::Base
class CourseStat < StatsParent
class PlayerCourseStat < CourseStat
当你有一个PlayerCourseStat时,你有一个Course stat,因为你已经建立了一个IS-A关系...一个PlayerCourseStat IS-A CourseStat。你的意思是:
class PlayerCourseStat < StatsParent