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
用户
可以有许多列表
,而列表
可以有许多项目
。每个列表
都可以由任何用户添加一个项目
。这意味着,例如,您可以创建一个列表,我可以向其中添加项目。有道理?让我们继续前进
我希望能够在任何时间点找到XUser
创建的所有项目
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