Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用Sinatra将一个类关联到DataMapper中的两个不同类_Ruby_Associations_Sinatra_Datamapper - Fatal编程技术网

Ruby 使用Sinatra将一个类关联到DataMapper中的两个不同类

Ruby 使用Sinatra将一个类关联到DataMapper中的两个不同类,ruby,associations,sinatra,datamapper,Ruby,Associations,Sinatra,Datamapper,我正在与DataMapper和Sinatra合作创建一个简单的应用程序。结构如下: 该应用程序具有多个帐户。每个帐户都有用户和活动。每个用户都有与特定活动相关的评论 理想情况下,评论应该有一个用户id和一个活动id,以便将两者联系起来 我如何将这两个词联系起来?以下是我的代码,但它不起作用: class Account include DataMapper::Resource property :id, Serial property :mc_username, String, :r

我正在与DataMapper和Sinatra合作创建一个简单的应用程序。结构如下:

该应用程序具有多个帐户。每个帐户都有用户和活动。每个用户都有与特定活动相关的评论

理想情况下,评论应该有一个用户id和一个活动id,以便将两者联系起来

我如何将这两个词联系起来?以下是我的代码,但它不起作用:

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将它们联系起来

我很想知道这段代码是否正确,如何创建一条与这两者都相关的注释。如果不是,对于这种情况,什么样的结构和关联是最佳的


非常感谢你的帮助

您所做的似乎是合理的,我认为您只需要去掉
:key=>true
选项,因为您并不真的希望这些关联成为注释主键的一部分。

您可能应该从查看这些选项开始

Alex是对的,你有一个复合主键。如果您只希望每个用户在每个活动中都有一条评论,这是可以的,但情况可能并非如此,但您确实希望确保该评论与用户和活动相关联,因此请使用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
   #......

你可能也只是想让它成为必需的。

所以我的想法似乎是正确的。我可以通过以下方式将评论与用户和活动联系起来:

# 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
#首先获得一个用户和一个活动,我们可以将其与评论联系起来
user=user.get(user\u id)
活动=活动。获取(活动\u id)
comment=comment.new
comment.content=“评论的内容”

user.comments谢谢你的建议。将密钥更改为必填字段实际上相当大程度上清理了我的数据库模式!我将它们设置为键,因为在没有该选项的情况下,我一直会出错,但只要将字段设置为必需字段似乎就可以了。