Dynamoid / dynamoid

Ruby ORM for Amazon's DynamoDB.
MIT License
578 stars 195 forks source link

has_one doesn't allow custom foreign_key #740

Open FinnIckler opened 6 months ago

FinnIckler commented 6 months ago

I'm trying to implement a 1:1 relationship between two tables without duplicating data in a new column. The issue is that has_one does not allow specifying a custom foreign_key, while belongs_to does. This means a new column is created which contains a set of ids, even though I only want a 1:1 relationship. The only solution I came up with is to use belongs_to on both ends. Is this intended?

Example:

# models/registration
class Registration
  include Dynamoid::Document
  table name: EnvConfig.DYNAMO_REGISTRATIONS_TABLE, capacity_mode: nil, key: :attendee_id
  # does not work
  has_one :history, class: RegistrationHistory, foreign_key: :attendee_id
  # works, but is semantically incorrect
  belongs_to :history, class: RegistrationHistory, foreign_key: :attendee_id
end

# models/registration_history
class RegistrationHistory
  include Dynamoid::Document

  table name: EnvConfig.REGISTRATION_HISTORY_DYNAMO_TABLE, capacity_mode: nil, key: :attendee_id
  # works
  belongs_to :registration, foreign_key: :attendee_id
end
andrykonchin commented 6 months ago

Yes, it makes sense to be able to reuse an existing scalar attribute in a model with has_one association. Will add this to the todo list.