Привязка одного класса к двум разным классам в DataMapper с помощью Sinatra - PullRequest
1 голос
/ 09 июля 2011

Я работаю с DataMapper и Sinatra, чтобы создать простое приложение.Вот структура:

Приложение имеет учетные записи.У каждой учетной записи есть пользователи и кампании.У каждого пользователя есть комментарии, которые должны быть связаны с конкретной кампанией.

В идеале комментарии должны иметь идентификатор пользователя и идентификатор кампании, чтобы связать их обоих.

Как я могу связать 2 вместе?Вот код, который у меня есть, который не работает:

class Account
  include DataMapper::Resource
  property :id, Serial
  property :mc_username, String, :required => true
  property :mc_user_id, String, :required => true
  property :mc_api_key, String, :required => true
  property :created_at, DateTime
  property :updated_at, DateTime
  has n, :users
  has n, :campaigns
end

class User
  include DataMapper::Resource
  property :id, Serial
  property :name, String, :required => true
  property :email, String, :required => true
  property :is_organizer, Integer
  property :created_at, DateTime
  property :updated_at, DateTime
  belongs_to :account, :key => true
  has n, :comments
end

class Campaign
  include DataMapper::Resource
  belongs_to :mailchimpaccount, :key => true
  has n, :comments
  property :id, Serial
  property :cid, String
  property :name, String
  property :current_revision, Integer
  property :share_url, Text, :required => true
  property :password, String
  property :created_at, DateTime
  property :updated_at, DateTime
end

class Comment
  include DataMapper::Resource
  belongs_to :campaign, :key => true
  belongs_to :user, :key => true
  property :id, Serial
  property :at_revision, Integer
  property :content, Text
  property :created_at, DateTime
end

С этим кодом я не могу сохранить комментарий, так как не могу понять, как связать его с кампанией и пользователем нав то же время.На самом деле я не могу разобраться, стоит ли мне вообще пытаться связать их, используя DataMapper.

Мне бы хотелось узнать, верен ли этот код, как я могу создать комментарий, связанный скак для.Если нет, то какая структура и ассоциации будут оптимальными для этого сценария?

Большое спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 09 июля 2011

Вы, вероятно, должны начать с просмотра этих документов datamapper по свойствам .

Алекс прав, у вас есть составной первичный ключ. Это было бы хорошо, если бы вы хотели, чтобы у каждого пользователя был один комментарий на кампанию, но это, вероятно, не так, но вы действительно хотите убедиться, что комментарий связан с пользователем и кампанией, поэтому используйте required => true, например так:

class Comment
   include DataMapper::Resource
   property :id, Serial
   belongs_to :campaign, :required => true
   belongs_to :user, :required => true
   property :at_revision, Integer
   property :content, Text
   property :created_at, DateTime
end

Также ваш ключ в модели кампании может быть проблематичным:

class Campaign
   include DataMapper::Resource
   belongs_to :mailchimpaccount, :key => true
   #......

Вы, вероятно, просто хотите сделать это необходимым.

1 голос
/ 10 июля 2011

Так что, похоже, мое мышление было правильным.Я могу связать комментарий как с пользователем, так и с кампанией следующим образом:

# Get a user and a campaign first that we can relate to the comment
user = User.get(user_id)
campaign = Campaign.get(campaign_id)
comment = Comment.new
comment.content = "The comment's content"
user.comments << comment # This relates the comment to a specific user
campaign.comments << comment # This now relates the comment to a specific campaign
comment.save # Save the comment

Предложение Dangermouse заменить опцию :key => true на :required => true также помогло очистить схему,Спасибо!

1 голос
/ 09 июля 2011

То, что вы делаете, кажется разумным, я думаю, вам просто нужно избавиться от опций :key => true, поскольку вы не хотите, чтобы эти ассоциации были частью первичного ключа комментария.

...