2011-11-22 67 views
1

我正在阅读A Guide to Active Record Associations如果X has_one Y,那么你是否还必须说Y属于X?

我知道你在has_one或belong_to之间进行选择,具体取决于你想如何布置关联。

但是我不完全清楚下面是否有区别。

  1. x声明HAS_ONE y或belong_to X
  2. x声明HAS_ONE Y和Y belong_to X

那么,有没有,你必须明确地说,X HAS_ONE Y和Y belong_to X任何情况下? 或者是说X has_one Y或Y belong_to X总是足够的。

回答

2

has_many:添加用于检索和查询关联对象集合的方法。

belongs_to的:增加了检索和单个关联对象的查询此对象包含一个id

所以,如果你不要求对两者使用方法,你可以选择不设定的关联的关联对象的方法因此必须将外键放在模型中,在该模型中,一个实例与另一个对象的一个​​且仅有的一个实例关联,即“belongs_to”模型。

释:

让我们考虑的模式,如:

create_table "cars", :force => true do |t| 
t.integer "user_id" 
t.datetime "created_at" 
t.datetime "updated_at" 
end 

create_table "users", :force => true do |t| 
t.datetime "created_at" 
t.datetime "updated_at" 
end 

和模型为:

class User < ActiveRecord::Base 
end 

class Car < ActiveRecord::Base 
belongs_to :user 
end 

结果是:

D:\temp>rails c 
Loading development environment (Rails 3.0.10) 
irb(main):001:0> U = User.first 
=> #<User id: 1, created_at: "2011-11-22 06:43:04", updated_at: "2011-11-22 06:43:04"> 

irb(main):002:0> C = Car.first 
=> #<Car id: 1, user_id: 1, created_at: "2011-11-22 06:43:34", updated_at: "2011-11-22 06:43:34"> 
irb(main):003:0> C.user 
=> #<User id: 1, created_at: "2011-11-22 06:43:04", updated_at: "2011-11-22 06:43:04"> 
irb(main):004:0> U.cars 
NoMethodError: undefined method `cars' for #<User:0x3d19970> 
from C:/Ruby/lib/ruby/gems/1.9.1/gems/activemodel-3.0.10/lib/active_model/attribute_methods.rb:392:in `method_missing' 
    from C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.10/lib/active_record/attribute_methods.rb:46:in `method_missing' 
    from (irb):4 
    from C:/Ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.10/lib/rails/commands/console.rb:44:in `start' 
    from C:/Ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.10/lib/rails/commands/console.rb:8:in `start' 
    from C:/Ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.10/lib/rails/commands.rb:23:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 
irb(main):005:0> exit 

而且如果款都喜欢下面:

和模型为:

class User < ActiveRecord::Base 
has_many :cars 
end 

class Car < ActiveRecord::Base 
end 

结果是:

D:\temp>rails c 
Loading development environment (Rails 3.0.10) 
irb(main):001:0> U = User.first 
=> #<User id: 1, created_at: "2011-11-22 06:43:04", updated_at: "2011-11-22 06:43:04"> 
irb(main):002:0> C = Car.first 
=> #<Car id: 1, user_id: 1, created_at: "2011-11-22 06:43:34", updated_at: "2011-11-22 06:43:34"> 
irb(main):003:0> U.cars 
=> [#<Car id: 1, user_id: 1, created_at: "2011-11-22 06:43:34", updated_at: "2011-11-22 06:43:34">] 
irb(main):004:0> C.user 
NoMethodError: undefined method `user' for #<Car:0x41524c8> 
    from C:/Ruby/lib/ruby/gems/1.9.1/gems/activemodel-3.0.10/lib/active_model/attribute_methods.rb:392:in `method_missing' 
    from C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.10/lib/active_record/attribute_methods.rb:46:in `method_missing' 
    from (irb):4 
    from C:/Ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.10/lib/rails/commands/console.rb:44:in `start' 
    from C:/Ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.10/lib/rails/commands/console.rb:8:in `start' 
    from C:/Ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.10/lib/rails/commands.rb:23:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 
irb(main):005:0> 
3

你不要来,它只是取决于你的需要。

所有的方法都是将其他方法/元数据添加到它们使用的类中:如果您不想/需要这些方法,则不需要添加它们。

添加的方法在details section

+0

但是如果你只使用其中的一个会发生什么。你可以打电话给X.Y和Y.X吗? – John

+2

@John No;每种方法都会将方法添加到其使用的类中 - 而不是引用的类。 –

+0

我明白了。对于声明'belongs_to'的表中的外键是否有任何意义? – John

相关问题