0

3つのモデル:

User
List
Item

Userは多くを持つことができ、缶は多くを持つことができListsます。それぞれに任意の値を追加できます。これは、たとえば、リストを作成してアイテムを追加できることを意味します。わかる?続けましょう。ListItemsListItemUser

ItemsXによって作成されたすべてのもの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

アイテムとユーザーの間には2 つの異なる関係があるようです: 1)itemsによって追加さlistsusers、2)listsによって作成されusersます。

リストを作成できるユーザーは 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

これらすべての関係が必要であると仮定するのは理にかなっています。つまり、リストを作成したときに、作成者を示すためにリストには 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 個の間違いがあるかもしれませんが、一般的にはこれがモデル化できる 1 つの方法です。

于 2013-02-28T01:49:51.263 に答える