Укажите дополнительную ссылку в вашей модели Rails

У меня есть модель спонсоров и промо-коды.

  • Спонсор может иметь ноль или более промо-кодов
  • Промо-код может иметь ноль или одного спонсора

Таким образом, промо-код должен иметь необязательную ссылку на спонсора, то есть sponsor_id это может иметь или не иметь значение. Я не уверен, как настроить это в Rails.

Вот что у меня так далеко:

# app/models/sponsor.rb
class Sponsor < ActiveRecord::Base
  has_many :promo_codes  # Zero or more.
end

# app/models/promo_code.rb
class PromoCode < ActiveRecord::Base
  has_one :sponsor  # Zero or one.
end

# db/migrate/xxxxx_add_sponsor_reference_to_promo_codes.rb
# rails g migration AddSponsorReferenceToPromoCodes sponsor:references
# Running migration adds a sponsor_id field to promo_codes table.
class AddSponsorReferenceToPromoCodes < ActiveRecord::Migration
  def change
    add_reference :promo_codes, :sponsor, index: true
  end
end

Имеет ли это смысл? У меня сложилось впечатление, что я должен использовать belongs_to в моей модели промо-кодов, но у меня нет никаких оснований для этого, просто я не видел has_many с has_one пример еще.

3 ответа

Решение

Это выглядит как простое отношение has_many и own_to:

# app/models/sponsor.rb
class Sponsor < ActiveRecord::Base
  has_many :promo_codes  # Zero or more.
end

# app/models/promo_code.rb
#table has sponsor_id field
class PromoCode < ActiveRecord::Base
  belongs_to :sponsor  # Zero or one.
end

has_one здесь не подходит, так как он заменит has_many: т. е. у вас есть "has_many" и "own_to" или "has_one" и "own_to". has_one обычно мало используется: обычно он используется, когда у вас уже есть отношение has_many, которое вы хотите изменить на has_one и не хотите реструктурировать существующие таблицы.

В Rails 5, значение__ определяется как обязательное по умолчанию. Чтобы сделать его необязательным, используйте опцию "необязательно":)

class User
  belongs_to :company, optional: true
end

Источник: https://github.com/rails/rails/issues/18233

Если вы не укажете валидацию, по умолчанию отношения не являются обязательными.

belongs_to это сказать рельсам другую половину отношений между этими двумя объектами, так что вы также можете вызвать @promo_code.sponsor и наоборот, @sponsor.promo_codes,

Другие вопросы по тегам