gpt4 book ai didi

ruby-on-rails - acts_as_tree 和 has_many :through not working well together

转载 作者:行者123 更新时间:2023-12-04 03:36:06 28 4
gpt4 key购买 nike

我有以下内容:

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
我可以通过这个得到所有的 child :

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 |
+----+----------------------------------------------------+----------------+

谢谢

最佳答案

试试这个。

class Menu < ActiveRecord::Base
has_many :menu_headers, :conditions => {:parent_id => 0}
has_many :menu_sub_headers, :class_name => 'MenuHeader'
has_many :menu_items, :through => :menu_sub_headers
end

class MenuHeader < ActiveRecord::Base
belongs_to :menu
has_many :menu_items
acts_as_tree
end

class MenuItem < ActiveRecord::Base
has_one :menu, :through => :menu_header
belongs_to :menu_header
end

应该给出:

m1=Menu.create(:name => "Dinner Menu test", :location_id => 145)
c1=m1.menu_headers.create(:name => "White Wine")
c2=c1.children.create(:name => "Sauvignon Blanc", :menu => m1)
mi1=c2.menu_items.create(:header => "SB menu item #1")
mi2=c1.menu_items.create(:header => "SB menu item #2")
m_1.menu_items # should return mi1 and mi2
m_1.menu_headers # should return just c1
m_1.menu_sub_headers # should return c1 and c2

关于ruby-on-rails - acts_as_tree 和 has_many :through not working well together,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8296551/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com