Найкраща практика щодо порожніх асоціацій


75

Уявіть собі таку ситуацію:

У мене є dogмодель і houseмодель. Собака може належати до будинку, а в будинку може бути багато собак, тому:

Class Dog <  ActiveRecord::Base
  belongs_to :house
end

Class House < ActiveRecord::Base
  has_many :dogs
end

А тепер уявіть, що я також хочу створити собак, у яких немає будинку. Вони не належать до будинку. Чи можу я все ще використовувати цю структуру відносин і просто не повідомляти a :house_idпри її створенні?

Чи є краща практика?

Obs .: Я використав цю аналогію, щоб спростити свою проблему, але моя реальна ситуація така: у мене є модель, яку користувач може генерувати її екземпляри. Він також може створювати колекції цих екземплярів, але може залишати екземпляр поза колекцією.


2
так..можеш піти, house_id nullі коли ти @dog.houseповернеться, nilщоб ти міг перевірити це як if @dog.houseі так далі ..
rubyprince

2
Щоб переконатися, що це працює, у вашій базі даних таблиця Dog не повинна мати нульової частини t.integer "house_id", :null => false.
Ашітака

Відповіді:


27

Я думаю, це абсолютно нормальний підхід.

Ви можете просто залишити house_idзі nullзначенням у базі даних моделі, які не належать іншим.


332

Будьте обережні з цим у Rails 5 ...

#belongs_to потрібно за замовчуванням

Відтепер кожна програма Rails матиме нову опцію конфігурації config.active_record.belongs_to_required_by_default = true, вона буде викликати помилку перевірки при спробі зберегти модель, де belongs_toасоціації відсутні.

config.active_record.belongs_to_required_by_defaultможе бути змінено на falseта з цим зберегти стару поведінку Rails або ми можемо відключити цю перевірку для кожного belongs_toвизначення, просто передавши додаткову опцію optional: trueнаступним чином:

class Book < ActiveRecord::Base
  belongs_to :author, optional: true
end

з: https://sipsandbits.com/2015/09/21/whats-new-in-rails-5/#belongs_toisrequiredbydefault


30
це відповідь користувачам Rails 5
Iván Cortés Romero

3
Провів 2 ночі на цьому ... дякую хлопці. Можна підтвердити необов’язково: true робить трюк. Моїм випадком використання було: class User < ApplicationRecord belongs_to :team, optional: true end class Team < ApplicationRecord has_many :users end
Райан Баклі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.