Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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 RubyonRails使用同一模型进行多个关联_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails RubyonRails使用同一模型进行多个关联

Ruby on rails RubyonRails使用同一模型进行多个关联,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个例子,每个用户都有许多项,每个项都有许多用户。 但是,我还想为每个用户分配一个主项。我不知道实现这一目标的最佳架构决策是什么。最后,我希望能够打电话: User.primary_item 这听起来像是一段经历了很多次的关系 class User has_many :owned_items has_many :items, through :owned_items end class Item has_many :owned_items has_many :users,

我有一个例子,每个用户都有许多项,每个项都有许多用户。 但是,我还想为每个用户分配一个主项。我不知道实现这一目标的最佳架构决策是什么。最后,我希望能够打电话:

User.primary_item

这听起来像是一段经历了很多次的关系

class User
  has_many :owned_items
  has_many :items, through :owned_items
end

class Item
  has_many :owned_items
  has_many :users, through :owned_items
end

class OwnedItem
  belongs_to :items
  belongs_to :users
end

您可以在所拥有的\u项目上拥有一个主属性,而不是为主\u项目建立单独的关系。

根据给出的信息,我建议在两个模型上都建立一个关联。在
User
模型上,为
primary\u item\u id
添加一列,然后向
User
模型添加一个名为
primary\u item
的列,以获取该用户的主要项。注意,一个
有很多到:
关联还需要您创建一个关联的联接表,
UserItems

class User < ActiveRecord::Base
  has_many :user_items
  has_many :items, through: :user_items
  scope :primary_item, -> { Item.find(self.primary_item_id) }
end

class UserItem < ActiveRecord::Base
  belongs_to :user
  belongs_to :item
end

class Item < ActiveRecord::Base
  has_many :user_items
  has_many :users, through: :user_items
end
class用户{item.find(self.primary_item_id)}
结束
类UserItem

这是
ActiveRecord
型号的相关信息。您还需要运行迁移来创建
UserItems
表,并将
primary\u item\u id
列添加到
Users
表中。请注意,您没有在此处的任何位置使用
:外键。

这需要一个新的表号吗?下面的内容会更简单吗?属于:primary\u item,:class\u name=>“item”,:foreign\u key=>“primary\u item\u id”@rantingsonrails,添加
:foreign\u key
违反Rails惯例。我发现添加一个新表比反对Rails的惯例要容易得多,你的问题是“每个用户都有很多项,每个项都有很多用户”。它要么是一种“有很多”的关系,要么是一种“有很多”和“属于”的关系。我认为当你开发你的应用程序时,你会发现一个“有很多”的应用程序会给你带来很多好处。我认为你编辑之前的关联可以发挥作用<代码>:在
上支持外键
。也就是说,如果一个项目只能有一个所有者。如果有几个人可以拥有与他们的主项相同的项,那么可能关联应该走另一条路。但是如果有一个,它不会在items表上而不是在users表上查找外键吗?“属于”会更好吗?是的,如果关系是多个用户可以拥有相同的主项,但一个用户只能拥有一个这样的主项,那么您可以在用户上拥有一个
主项id
,在用户上拥有一个
属于
。当然,您仍然需要多对多关系的联接表,那么,为什么不使用一个
has_many:to
,并设置一个属性,使其成为联接表中的主要项呢
有很多:项,通过::项用户
有一个:主项,通过::项用户,->{其中主项:true}
就是这样。该联接表已经存在,并以这种方式设计(而不是作为HABTM)来实现这种可能性。谢谢他需要许多项和一个用户项。我认为您所需要的只是Users表中的一个字段,用于指向Items表中的记录。不需要另一张桌子。@Kalman,你错了。正如他在问题“我有一个案例,每个用户都有很多项目,每个项目都有很多用户”中所引用的那样,这是一种多对多关系。他还想为每个用户分配一个主项。这是正确的。用户和项目之间是多对多的关系。用户的主项也有一个has-one。除非我遗漏了什么,否则您将需要一个多对多关联的联接表。has_one关联是单独建模的,在
用户
模型上添加了一列(或者,正如@rantingonrails所选择的,作为联接表上的一列)。哦,我想我看到了错误的通信。在我的示例代码中,
user\u items
是联接表的名称。也许你把它错当成了主要的东西。