Ruby on Rails的模型关系问题

时间:2009-11-23 11:10:12

标签: ruby-on-rails ruby activerecord

我有几个型号:

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, ...>]
  1. 我对课程模型集的关系有问题吗?
  2. 为什么course_stat在控制台中没有,但在应用程序中没有,因为它正在运行?
  3. 更新

    进一步研究一下,我查看了日志,以获取为控制台和应用程序生成的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?

3 个答案:

答案 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