Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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 on rails 为这个用例设置我的表和关系的最佳方法是什么?_Ruby On Rails_Ruby_Models_Relationships - Fatal编程技术网

Ruby on rails 为这个用例设置我的表和关系的最佳方法是什么?

Ruby on rails 为这个用例设置我的表和关系的最佳方法是什么?,ruby-on-rails,ruby,models,relationships,Ruby On Rails,Ruby,Models,Relationships,1) 一个用户可能有许多原因,而一个原因可能属于多个用户 2) 一个用户可以有多个活动,并且活动可以属于多个用户。运动属于一个原因 我希望能够将原因或活动分别分配给给定的用户。因此,可以为用户分配特定的活动。或者,可以为用户分配一个原因,然后该原因的所有活动都应该与一个用户关联 有可能吗?我是否可以将其设置为使关系简化为这样: 用户原因=属于用户的所有原因 用户。活动=属于用户的所有活动,无论是通过原因关联还是活动关联我认为您应该使用以下内容: class User < ActiveRec

1) 一个用户可能有许多原因,而一个原因可能属于多个用户

2) 一个用户可以有多个活动,并且活动可以属于多个用户。运动属于一个原因

我希望能够将原因或活动分别分配给给定的用户。因此,可以为用户分配特定的活动。或者,可以为用户分配一个原因,然后该原因的所有活动都应该与一个用户关联

有可能吗?我是否可以将其设置为使关系简化为这样:

用户原因=属于用户的所有原因


用户。活动=属于用户的所有活动,无论是通过原因关联还是活动关联

我认为您应该使用以下内容:

class User < ActiveRecord::Base
   has_and_belongs_to_many :causes
   has_and_belongs_to_many :campaigns
end

class Cause < ActiveRecord::Base
   has_and_belongs_to_many :users
   has_many :campaigns
end

class Campaign < ActiveRecord::Base
   has_and_belongs_to_many :users
   belongs_to :cause
end
您可以阅读关于
拥有和属于多个
关系,关于
拥有一个
和关于
属于

如果这是您想要的,请告诉我:]

编辑:

“我仍然需要User.campaigns来 可能是由于用户的原因或 与项目关联的单个活动 用户“

您可以在users模型上使用一个方法返回所有活动。大概是这样的:

def all_campaigns
   self.campaigns + self.causes.collect{ |c| c.campaigns }
end
这应该行得通

class User < ActiveRecord::Base
  has_many :causes, :through => :cause_users
  has_many :campaigns, :through => :campaign_users
  # other model stuff

class Cause < ActiveRecord::Base
  has_many :users, :through => :cause_users
  has-many :campaigns
  # other model stuff

class Campaign < ActiveRecord::Base
  belongs_to :cause
  has_many :users, :through => :campaign_users
  # other model stuff

class CampaignUser < ActiveRecord::Base
  belongs_to :campaign
  belongs_to :user
  # other model stuff

class CauseUser < ActiveRecord::Base
  belongs_to :cause
  belongs_to :user
  # other model stuff
class用户:原因\u用户
拥有\u多个:活动,:至=>:活动\u用户
#其他模型材料
类原因:cause\u用户
有很多:运动
#其他模型材料
类活动:活动\u用户
#其他模型材料
类活动用户
has\u many:through要求您为以下每个联接创建一个新模型:活动用户和原因用户,如图所示,但它在以后提供的功能比has\u和\u besign\u many更多


我还建议使用比:campaign_用户和:cause_用户更好的名称,这样关系才更有意义

您可以通过使用加入模型的用户和活动之间的关联,以及使用另一个加入模型的用户和原因之间的关联,创建:has_many:。您可以在“原因”模型中创建:has\u many:campetings关联,并在“活动”模型中放置:bellows\u to:campetings


但您将无法按User.campaings.orders或User.order.campaings获取所有用户活动或原因。您应该在User.campaings集合或User.causes上进行迭代,获取Campaign.cause或cause.capaigns。甚至可以进行自定义SQL查询,使用联接和条件过滤联接中的信息。

我认为这很接近。一个事业可以有很多活动。而且我仍然需要User.campaign是来自用户原因的活动或与用户关联的单个活动…我认为您编辑的解决方案会起作用。我在返回的集合中添加了.flatte.uniq以消除重复项,我认为我可以继续了。我真的很感谢你的帮助:)-我确实使用了has_many:through而不是has_,并且_属于_many。为什么使用has_many
“在以后提供了比has_和_属于_many更多的功能”
?这是我最初的想法,但它有一些漏洞。假设某个原因属于某个用户(具有活动),您将如何通过该原因通过该用户检查活动?它类似于User.causes.campetings,但我希望能够调用User.campetings,并从campeting_用户和cause_用户下面查找特定用户的活动。这有意义吗?has_和_belies_to_many(HABTM)不允许您获得关于这段关系的其他信息。例如,如果您要为特定活动分配用户角色(例如,一个活动的负责人、另一个活动的秘书),您将无法使用HABTM执行此操作。@Dustin:这设置了一个用户与活动有许多关系,因此您可以直接从该用户访问活动。
class User < ActiveRecord::Base
  has_many :causes, :through => :cause_users
  has_many :campaigns, :through => :campaign_users
  # other model stuff

class Cause < ActiveRecord::Base
  has_many :users, :through => :cause_users
  has-many :campaigns
  # other model stuff

class Campaign < ActiveRecord::Base
  belongs_to :cause
  has_many :users, :through => :campaign_users
  # other model stuff

class CampaignUser < ActiveRecord::Base
  belongs_to :campaign
  belongs_to :user
  # other model stuff

class CauseUser < ActiveRecord::Base
  belongs_to :cause
  belongs_to :user
  # other model stuff