私は次のものを持っています:
class Menu < ActiveRecord::Base
has_many :menu_headers
# has_many :menu_headers, :conditions => {:parent_id => 0} - was trying
# to set parent_id to 0 for top level
has_many :menu_items, :through => :menu_headers
end
class MenuHeader < ActiveRecord::Base
belongs_to :menu
has_many :menu_items
acts_as_tree
end
class MenuItem < ActiveRecord::Base
#belongs_to :menu
has_one :menu, :through => :menu_header
belongs_to :menu_header
end
編集#3-シードデータサンプルこれは、たとえば、シードの方法です(mi_1とmi_2の両方を取得したい)
m_1=Menu.create({:name => "Dinner Menu test", :location_id => 145})
c_1=m_1.menu_headers.create({:name => "White Wine"})
c_2=c_1.children.create({:name => "Sauvignon Blanc"})
mi_1=c_2.menu_items.create({:header => "SB menu item #1"})
mi_2=c_1.menu_items.create({:header => "SB menu item #2"})
m_1.menu_items # returns only mi_2; would like both mi_2 and mi_1
終了編集#3
問題は、すべてのmenu_itemsを返すために次のことを実行できないことです。
m=Menu.find(5)
m.menu_items
メニューのhas_many:throughの場合。これにより、最上位レベルのメニュー項目のみが取得され、より深いレベルは取得されません。menu_idをmenu_headersに追加しようとしましたが、これにより、commented_out行を追加する必要があり、トップレベルのヘッダーのみを取得するようになりました。上記が機能するように、menu_headerのより深いレベルをすべて取得すると言う方法はありますか?
これまたは他の何かに対する回避策はありますか?私はacts_as_treeにかなりこだわっているので、awesome_nested_setのようなものを使用することは実際にはカードに含まれていません。
どうも
編集-以下のコメントのいくつかの問題。私はこれを午前4時に書きました
編集#2
私はこれを介してすべての子供を得ることができます:
class MenuHeader < ActiveRecord::Base
...
# only gets all children of the current menu_header_id
def all_children
all = []
self.children.each do |menu_header|
all << menu_header
root_children = menu_header.all_children.flatten
all << root_children unless root_children.empty?
end
return all.flatten
end
end
all_childrenを呼び出して、メインメニュー項目でmenu_itemsを取得できるようにしたいと思います。おそらく、上記をメインのメニュー項目の呼び出しと統合し、menu_itemが更新されたときに、キャッシュされたコピーをメニューテーブルに保存するだけです。
Ancestryを調べますが、他のコードがこれに依存しているため、別のgemに移動することを躊躇します。すばやく実行できれば問題ないかもしれませんが、これは他の多くの部分を含むかなり複雑なオブジェクトであり、acts_as_treeはかなり単純です。
編集#4-サンプルデータは次のとおりです。
menus
+----+-------------+------------------+
| id | location_id | name |
+----+-------------+------------------+
| 1 | 145 | item cocktails |
+----+-------------+------------------+
menu_headers
+----+----------------------+-----------+---------+
| id | name | parent_id | menu_id |
+----+----------------------+-----------+---------+
| 1 | Wines By The Glass | 0 | 1 |
| 2 | WHITE WINES | 1 | NULL |
| 3 | WHITE WINES child #1 | 2 | NULL |
| 4 | WHITE WINES child #2 | 2 | NULL |
| 5 | WHITE WINES child #3 | 2 | NULL |
| 6 | RED WINES | 0 | 1 |
+----+----------------------+-----------+---------+
menu_items
+----+----------------------------------------------------+----------------+
| id | header | menu_header_id |
+----+----------------------------------------------------+----------------+
| 1 | SAUVIGNON BLANC item #1 | 2 |
| 2 | MONTEPULCIANO | 6 |
+----+----------------------------------------------------+----------------+
どうも