【问题标题】:Help with Associations in Rails 3帮助 Rails 3 中的关联
【发布时间】:2010-04-30 17:05:10
【问题描述】:

红宝石:1.9.2
Rails:3.0beta3

我需要一些有关 Rails 3 关联的帮助。

我有以下型号(请参阅下面的摘录):

学校、州、SchoolLocale

schools 表有以下字段:

id、姓名、state_id、school_locale_id

状态表具有以下字段:

id,缩写,名字

school_locales 表有以下字段:

ID、代码、名称

很遗憾,我的数据源没有 school_locales 的 ID。因此,存储在schools 表中'school_locale_id' 字段中的数据实际上映射到school_locales 表中的'code' 字段中。

school.rb:

class School < ActiveRecord::Base
    belongs_to :state
    belongs_to :school_locale
end

state.rb:

class State < ActiveRecord::Base
    has_many :schools
end

school_locale.rb:

class SchoolLocale < ActiveRecord::Base
    has_many :schools
end

我想查询给定学校,比如 School.find(1),它将输出学校名称、州名和学校区域名称。我假设我需要在 school_locales 表中的“代码”字段中添加一个索引,并以某种方式将其指定为外键,但我不确定。任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-3


    【解决方案1】:

    这并不能完全回答您的问题,但我认为这是一个有用的信息。关于您使用states 表,我参考Surrogate Vs. Natural/Business Keys

    @Ted 在这里说:

    请记住,主键没有什么特别之处,只是它被标记为这样。它只不过是一个 NOT NULL UNIQUE 约束,一个表可以有多个。

    如果您使用代理键,您仍然需要一个业务键来确保根据业务规则的唯一性。

    拥有链接到states 表的state_id 外键是没有意义的。每个州都已经有一个唯一的 id;其 2 个字母的缩写。这个唯一的 id 和数字一样好。而且由于这些数据不会经常更改,因此在您的应用程序中的某个地方对其进行静态定义并没有什么坏处。

    【讨论】:

    • 一旦我得到解决方案,我将研究如何在 states 表上不需要 ID。
    【解决方案2】:

    我不太确定,但你可以试试这个:

    class SchoolLocale < ActiveRecord::Base
        has_many :schools, :primary_key => :code
    end
    

    让我知道它是否有效:]

    【讨论】:

    • 很遗憾,这是不行的。
    • 使用这段代码和School.find(1).school_locale会得到什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多