Укажите дополнительную ссылку в вашей модели 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
Если вы не укажете валидацию, по умолчанию отношения не являются обязательными.
belongs_to
это сказать рельсам другую половину отношений между этими двумя объектами, так что вы также можете вызвать @promo_code.sponsor
и наоборот, @sponsor.promo_codes
,