Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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 Rails多个父关系_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Rails多个父关系

Ruby on rails Rails多个父关系,ruby-on-rails,ruby,Ruby On Rails,Ruby,三种模式: User List Item 用户可以有许多列表,而列表可以有许多项目。每个列表都可以由任何用户添加一个项目。这意味着,例如,您可以创建一个列表,我可以向其中添加项目。有道理?让我们继续前进 我希望能够在任何时间点找到XUser创建的所有项目 class User < ActiveRecord::Base has_many :lists has_many :items end class List < ActiveRecord::Base belongs_t

三种模式:

User
List
Item
用户
可以有许多
列表
,而
列表
可以有许多
项目
。每个
列表
都可以由任何
用户添加一个
项目
。这意味着,例如,您可以创建一个列表,我可以向其中添加项目。有道理?让我们继续前进

我希望能够在任何时间点找到X
User
创建的所有
项目

class User < ActiveRecord::Base
  has_many :lists
  has_many :items
end
class List < ActiveRecord::Base
  belongs_to :user
  has_many :items
end
class Item < ActiveRecord::Base
  belongs_to :list
  belongs_to :user
end

那么,我错过了什么?我的人际关系是不是错了(很可能)?告诉我!:)

项目和用户之间似乎有两种不同的关系:1)
项目
用户
添加到
列表
,2)
列表
用户
创建

只有一个用户可以创建列表。许多用户可以在创建项目后将其添加到列表中

所以建模需要两种不同的关系

class User < ActiveRecord::Base
  has_many :lists
  has_many :items_added, :class_name => "Item", :foreign_key => "added_by_user_id"
end
class List < ActiveRecord::Base
  belongs_to :user
  has_many :items
end
class Item < ActiveRecord::Base
  belongs_to :list
  belongs_to :added_by_user, :class_name => "User",  :foreign_key => "user_id"
end
现在,您可以使用以下方法查找用户添加的所有项目:

all_user_items = user.items_added

我还没有测试过这个,它有点复杂,所以代码中可能有1-2个错误,但通常这是建模的一种方法。

我喜欢这样,但我认为OP希望保存哪个用户添加了哪个项目。如果解决方案与您的一样,我会在用户模型中添加以下行:
有许多:项目,:通过=>:列表
,所以他可以直接做:user.items.Ah。我懂了。我的解决方案不捕获是哪个用户按原样添加了项目。让我重温一下。我修改了我的答案以考虑到你的观点。更好?@Kaeros如果我
有很多:项,:到=>:列表
,那么它会显示这些列表中的所有项,即使
用户id
# To create a user and a list is easy!
user = User.create(user_params)
list = user.create_list(list_params)

# but when adding an item, you need to know which user is adding it
item = list.create_item({:added_by_user => current_user, :item_name => 'name', etc})
all_user_items = user.items_added