【发布时间】:2013-01-13 08:25:12
【问题描述】:
我不得不围绕一个不符合“Rails 方式”的遗留 PostgreSQL 数据库构建一个 Rails 应用程序,因为无法实现多个 - 我不确定这是否是让我绊倒的原因up 或者让我绊倒的是我已经离开 Rails 太多个月了。
根据 Rails 指南,当您在模型上声明 belongs_to 时,将向该模型的每个实例添加四个方法。在 Guide 示例中,在 Order 表中添加 belongs_to :customer 会添加:customer、customer=、build_customer 和 create_customer。
我在检查中没有看到这一点。我做错了什么或错过了一步吗?
我的两张表是这样的:
class Zzaddress < ActiveRecord::Base
set_table_name 'zzaddress'
has_many :zzpersons, :class_name => 'Zzperson'
end
class Zzperson < ActiveRecord::Base
set_table_name 'zzperson'
belongs_to :zzaddress, :class_name => 'Zzaddress', :foreign_key => "zzaddress_id"
end
现在,如果我检索这样的地址:
myaddr = Zzaddress.where( :id => 972 )
我得到了预期的结果。
当我尝试访问分配给该地址的任何人时,如下所示:
myaddr.zzpersons
我得到了心爱的人
NoMethodError: undefined method `zzpersons' for #<ActiveRecord::Relation:0x103c015d0>
果然,如果我查看模型的方法,它也不存在:
myaddr.methods.sort
提出了很多方法,但在 zz 范围内没有什么;-)
如果我在没有关联的情况下这样做,它会按您的预期工作:
grp = Zzperson.where( :zzaddress_id => 972 )
=> [#<Zzperson id: 1347, ....>, #<Zzperson id: 1349, ...>, #<Zzperson id: 1968, ...>]
从很久以前学到的一个教训是在编辑模型文件之间退出 rails 控制台,我继续坚持这一点。有没有办法从控制台中检查模型定义?我还记得重装!命令,但我可能会认为这并不总是有效?
这是 rails 3.2.11(全新安装,所以一切都应该是最新的),3.2.11 的 activerecord 也是如此。对于它的价值,PostgreSQL gem 是 pg (0.14.1)。 PostgreSQL 的版本是 9.1.4。
为了完整起见,schema.rb 是由 rake:schema:dump 创建的,它看起来对我有效:
create_table "zzaddress", :id => false, :force => true do |t|
t.integer "id", :null => false
<snip>
end
create_table "zzperson", :id => false, :force => true do |t|
t.integer "id", :null => false
t.integer "zzaddress_id", :default => 0, :null => false
<snip>
end
pg_dump 创建的 SQL 语句文件显示了按预期创建的表:
CREATE TABLE zzaddress (
id integer NOT NULL,
etc.
);
CREATE TABLE zzperson (
id integer NOT NULL,
zzaddress_id integer DEFAULT 0 NOT NULL,
etc.
);
【问题讨论】:
-
在尝试了下面 Scott 的建议之后,我正在玩这个,我对此感到非常困惑,因为在我看来,我能够告诉 erb 以正常方式显示字段,但是在我在任何领域得到的控制台,更不用说 AR 关系,都是“缺少方法”
标签: postgresql activerecord ruby-on-rails-3.2