Если X имеет_ один Y, нужно ли вам также сказать, что Y принадлежат X? - PullRequest
1 голос
/ 22 ноября 2011

Я сейчас читаю Руководство по ассоциациям активных записей .

Я получаю, что вы выбираете между has_one или assign_to в зависимости от того, как вы хотите выложить ассоциацию.

Но мне не совсем ясно, есть ли разница между следующим.

  1. Объявить, что X имеет_ один Y или Y принадлежит_ X
  2. Объявить, что X имеет_ один Y И Y принадлежат X

Так есть ли случаи, когда вы должны явно сказать, что X имеет_ один Y, а Y принадлежит_ X? Или всегда достаточно сказать, что X имеет_ один Y или Y принадлежит_ X.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

У вас нет , это зависит только от ваших потребностей.

Все методы, которые вы делаете, - это добавление дополнительных методов / метаданных к классу, в котором они используются: если выне нужны / не нужны эти методы, нет необходимости добавлять их.

Добавленные методы находятся в разделе details .

2 голосов
/ 22 ноября 2011

has_many: добавляет методы для поиска и запроса коллекций связанного объекта.

assign_to: добавляет методы для поиска и запроса одного связанного объекта, для которого этот объект имеет идентификатор

поэтому, если вам не требуется использовать методы для обоих связанных объектов, вы можете выбрать не устанавливать соответствующую ассоциацию. Но обязательно поместить внешний ключ в модель, где один экземпляр связан с одним и только одним экземпляром другого.объект, который является: модель 'own_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>
...