0

三种型号:

User
List
Item

一个User可以有很多Lists,一个List可以有很多Items。每个都List可以Item由 ANY 添加User。例如,这意味着您可以创建一个列表,我可以向其中添加项目。说得通?我们继续吧。

我希望能够在任何时间点找到Items由 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

我不喜欢这个。它有一种时髦的气味,但我无法将手指放在它上面。我觉得应该有更好的东西。创建新的时Item,我必须编写如下所示的内容:

list = List.find(params[:list_id])
@item = list.items.new(params[:item])
user = User.first
@item.user = user
@item.save!

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

4

1 回答 1

0

似乎项目和用户之间可能存在两种不同的关系:1)items被添加到listsusers2)lists被创建users

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

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

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

假设您需要所有这些关系是有道理的——也就是说,一个列表在创建时需要一个 user_id 以显示谁创建了它。同样,一个项目需要记录谁将它添加到列表中。

您需要将该added_by_user_id列添加到您的items表中以使其正常工作并跟踪哪个用户添加了该项目。

所以你可以这样做:

# 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

我没有对此进行测试,它有点复杂,所以我可能在代码中有 1-2 个错误,但通常这是可以建模的一种方式。

于 2013-02-28T01:49:51.263 回答