Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

請問相同Model內的雙層has_many要如何實作? #48

Closed
minjindang opened this issue Oct 13, 2015 · 8 comments
Closed

請問相同Model內的雙層has_many要如何實作? #48

minjindang opened this issue Oct 13, 2015 · 8 comments
Labels

Comments

@minjindang
Copy link

如題,請問如何定義childrengrandchildren兩個methods,在同一個Person model內讀取關連?

# Create a "Person" model that allows a “children” method as below.
tom = Person.create(name: "Tom")
Person.create(name: "May", parent: tom)
Person.create(name: "Syd", parent: tom)

tom.children.map(&:name)
#=> ["Syd", "May"]
# Furthermore, how to implement a "grandchildren" method as below?
Person.create(name: "Wen", parent: syd)
Person.create(name: "Jon", parent: may)

tom.grandchildren.map(&:name)
#=> ["Wen", "Jon"]

出處:原Gist檔案

@adlerhsieh
Copy link
Member

看起來你是想要解決某個作業或指定的問題?

Model的實作算是Rails當中很基本但也很複雜的部份,從頭到尾描述的話可能寫3個小時也寫不完,而且網路上已經有非常多此類教材,不管收費與否都非常專業,建議參考網路上的現成教材,只要整個操作過一遍,要解開這兩題就不是難事了。

教材部分建議可以從實戰聖經的這篇Active Record基本說明入手,對於Active Record說明非常清楚,如果有點無法理解,我之前有寫過一篇尋找教材的參考,也可以參考一下。

@adlerhsieh
Copy link
Member

另外幫你稍微整理一下貼code方式,有其他人想回答的話應該比較快就catch到意思 :)

@minjindang
Copy link
Author

感謝,先說明這不是作業,目的是要挑戰自己能不能活用Model
自己有嘗試先建三個Model分別是Person Children Grandchildren
後來發現這樣行不通...

看了Active Record有很多部分,不知道哪個部分才是適合的?
是否能給一個明確方向,不是只是大方向

補充:可能會有程式碼所以打在gist上讓畫面簡潔一點

@minjindang minjindang changed the title 請問要怎麼實作Model? 請問大家是否針對下面的Model是否有最佳漂亮的解法? Oct 14, 2015
@minjindang minjindang changed the title 請問大家是否針對下面的Model是否有最佳漂亮的解法? 請問大家針對下面的Model是否有最佳漂亮的解法? Oct 14, 2015
@sunkai612
Copy link
Contributor

可以使用 self join table
http://guides.rubyonrails.org/association_basics.html#self-joins

Person 多開一個欄位 parent_id

children method 就去找 parent_id 為 Person id 的人
grandchildren 則是找 children 的 children 就可以了

@zackexplosion
Copy link
Member

建議貼 Code 的時候貼可以執行的 Code 。 這樣別人比較好 Try Code
https://gist.github.com/zackexplosion/89b56e68729c4c252d7c

@timfanda35
Copy link

想到了 ActsAsTree gem,或許可以做為參考

@adlerhsieh
Copy link
Member

@willycode 抱歉,因為我的理解錯誤才以為這是作業的問題,希望沒有造成困擾。

補充一下樓樓樓上的作法:

class Person < ActiveRecord::Base
  has_many   :children, class_name: "User", foreign_key: :parent_id
  belongs_to :parent,   class_name: "User"

  def grandchildren
    self.class.where(parent_id: children.ids)
  end
end

@minjindang
Copy link
Author

感謝大家:)

@adlerhsieh adlerhsieh changed the title 請問大家針對下面的Model是否有最佳漂亮的解法? 請問相同Model內的雙層has_many(self joins)要如何實作? Oct 15, 2015
@adlerhsieh adlerhsieh changed the title 請問相同Model內的雙層has_many(self joins)要如何實作? 請問相同Model內的雙層has_many要如何實作? Oct 15, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants