From 630de52fdd93e7465d0fb9dac5f35db30a2545d2 Mon Sep 17 00:00:00 2001 From: alpaca-tc Date: Mon, 17 Apr 2017 22:54:33 +0900 Subject: [PATCH] Required foreign keys (#2003) * Add `required: true` option to foreign column * Fixes NoMethodError ``` > Favourite.new.valid? NoMethodError: undefined method `reblog?' for nil:NilClass ``` --- app/models/favourite.rb | 6 +++--- app/models/mute.rb | 5 ++--- app/models/status.rb | 3 +-- app/models/subscription.rb | 2 +- app/models/user.rb | 3 +-- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/app/models/favourite.rb b/app/models/favourite.rb index 41d06e734..32d54476b 100644 --- a/app/models/favourite.rb +++ b/app/models/favourite.rb @@ -3,14 +3,14 @@ class Favourite < ApplicationRecord include Paginable - belongs_to :account, inverse_of: :favourites - belongs_to :status, inverse_of: :favourites, counter_cache: true + belongs_to :account, inverse_of: :favourites, required: true + belongs_to :status, inverse_of: :favourites, counter_cache: true, required: true has_one :notification, as: :activity, dependent: :destroy validates :status_id, uniqueness: { scope: :account_id } before_validation do - self.status = status.reblog if status.reblog? + self.status = status.reblog if status&.reblog? end end diff --git a/app/models/mute.rb b/app/models/mute.rb index a5b334c85..7987ed007 100644 --- a/app/models/mute.rb +++ b/app/models/mute.rb @@ -3,9 +3,8 @@ class Mute < ApplicationRecord include Paginable - belongs_to :account - belongs_to :target_account, class_name: 'Account' + belongs_to :account, required: true + belongs_to :target_account, class_name: 'Account', required: true - validates :account, :target_account, presence: true validates :account_id, uniqueness: { scope: :target_account_id } end diff --git a/app/models/status.rb b/app/models/status.rb index c0a5d9d1b..e54664275 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -10,7 +10,7 @@ class Status < ApplicationRecord belongs_to :application, class_name: 'Doorkeeper::Application' - belongs_to :account, inverse_of: :statuses, counter_cache: true + belongs_to :account, inverse_of: :statuses, counter_cache: true, required: true belongs_to :in_reply_to_account, foreign_key: 'in_reply_to_account_id', class_name: 'Account' belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies @@ -26,7 +26,6 @@ class Status < ApplicationRecord has_one :notification, as: :activity, dependent: :destroy has_one :preview_card, dependent: :destroy - validates :account, presence: true validates :uri, uniqueness: true, unless: 'local?' validates :text, presence: true, unless: 'reblog?' validates_with StatusLengthValidator diff --git a/app/models/subscription.rb b/app/models/subscription.rb index 497cabb09..63553e9fe 100644 --- a/app/models/subscription.rb +++ b/app/models/subscription.rb @@ -4,7 +4,7 @@ class Subscription < ApplicationRecord MIN_EXPIRATION = 3600 * 24 * 7 MAX_EXPIRATION = 3600 * 24 * 30 - belongs_to :account + belongs_to :account, required: true validates :callback_url, presence: true validates :callback_url, uniqueness: { scope: :account_id } diff --git a/app/models/user.rb b/app/models/user.rb index 27a38674e..a59d843d4 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -9,10 +9,9 @@ class User < ApplicationRecord otp_secret_encryption_key: ENV['OTP_SECRET'], otp_number_of_backup_codes: 10 - belongs_to :account, inverse_of: :user + belongs_to :account, inverse_of: :user, required: true accepts_nested_attributes_for :account - validates :account, presence: true validates :locale, inclusion: I18n.available_locales.map(&:to_s), unless: 'locale.nil?' validates :email, email: true