2014-10-09 38 views
9

我有一個family_tree和有人可以添加他們的親戚樹。如何優雅地處理Rails翻譯的雙面關係?

所以會發生什麼是爲每個family_tree條目創建一個membership記錄。

但是,如果Son增加Dad,我們應該能夠更新父親的家譜以將「兒子」添加到視圖中的樹中。什麼是最好的Rails方式來解決這個問題?我知道Rails在本地做了很多翻譯,還有複數化等等。無論如何,我想利用它來實現我想做的事情?

此外,什麼是類/模塊再次處理這些東西?的ActiveSupport?

這是我User型號:

# == Schema Information 
# 
# Table name: users 
# 
# id      :integer   not null, primary key 
# email     :string(255)  default(""), not null 
# encrypted_password  :string(255)  default(""), not null 
# reset_password_token :string(255) 
# reset_password_sent_at :datetime 
# remember_created_at :datetime 
# sign_in_count   :integer   default(0), not null 
# current_sign_in_at  :datetime 
# last_sign_in_at  :datetime 
# current_sign_in_ip  :string(255) 
# last_sign_in_ip  :string(255) 
# created_at    :datetime 
# updated_at    :datetime 
# name     :string(255) 
# confirmation_token  :string(255) 
# confirmed_at   :datetime 
# confirmation_sent_at :datetime 
# unconfirmed_email  :string(255) 
# invitation_relation :string(255) 
# avatar     :string(255) 
# 
class User < ActiveRecord::Base 
    has_one :family_tree, dependent: :destroy 
    has_many :memberships, dependent: :destroy 
    has_many :nodes, dependent: :destroy 
    has_many :participants, dependent: :destroy  
end 

FamilyTree.rb

# == Schema Information 
# 
# Table name: family_trees 
# 
# id   :integer   not null, primary key 
# name  :string(255) 
# user_id :integer 
# created_at :datetime 
# updated_at :datetime 
# 

class FamilyTree < ActiveRecord::Base 
    belongs_to :user 
    has_many :memberships, dependent: :destroy 
    has_many :members, through: :memberships, source: :user, dependent: :destroy 
    has_many :nodes, dependent: :destroy 
end 

Membership.rb

# == Schema Information 
# 
# Table name: memberships 
# 
# id    :integer   not null, primary key 
# family_tree_id :integer 
# user_id  :integer 
# created_at  :datetime 
# updated_at  :datetime 
# relation  :string(255) 
# 

class Membership < ActiveRecord::Base  
    belongs_to :family_tree 
    belongs_to :user  
end 

Node.rb

# == Schema Information 
# 
# Table name: nodes 
# 
# id    :integer   not null, primary key 
# name   :string(255) 
# family_tree_id :integer 
# user_id  :integer 
# media_id  :integer 
# media_type  :string(255) 
# created_at  :datetime 
# updated_at  :datetime 
# circa   :datetime 
# is_comment  :boolean 
# 

class Node < ActiveRecord::Base 
    belongs_to :family_tree 
    belongs_to :user 
    belongs_to :media, polymorphic: true, dependent: :destroy 
    has_many :comments, dependent: :destroy 
    has_many :node_comments, dependent: :destroy  
end 

_tree.html.erb看起來像這樣(截斷簡潔):

 <li class="tree-item-name"><a href="#">Great Grandparents</a> 
     <ul> 
      <li><% if relative.humanize == "Great Grandfather" || relative.humanize == "Great Grandmother" %> 
      <%= link_to image_tag(membership.user.avatar.url, size: "48x48", :class => "img-circle") , family_tree_path(membership.user.family_tree), :target => '_blank' %> 
       <%= link_to membership.user.name, family_tree_path(membership.user.family_tree), :target => '_blank'%> 
       <% else %> 
       None added yet, add them <%= link_to 'here', "#" , class: 'btn invite popupbox','data-popup' => 'invite_friend' %> 
      <% end %> 
      </li> 
     </ul> 
     </li> 
     <li class="tree-item-name"><a href="#">Grandparents</a> 
     <ul> 
      <li><% if relative.humanize == "Grandfather" || relative.humanize == "Grandmother" %> 
      <%= link_to image_tag(membership.user.avatar.url, size: "48x48", :class => "img-circle") , family_tree_path(membership.user.family_tree), :target => '_blank' %> 
       <%= link_to membership.user.name, family_tree_path(membership.user.family_tree), :target => '_blank' %> 
       <% else %> 
       None added yet, add them <%= link_to 'here', "#" , class: 'btn invite popupbox','data-popup' => 'invite_friend' %> 
      <% end %> 
      </li> 
     </ul> 
     </li> 
+0

您能否請:刪除所有不相關的代碼(Devise,attr_accessible,Carrierwave,其他協會等);明確新的家庭關係是如何創建的(邀請令牌的作用是什麼?)。 – tompave 2014-10-12 23:14:19

+0

另外,如果可能並且合適的話,從邀請令牌的底層細節中抽象出來。提出關於這些關聯的問題。 – tompave 2014-10-12 23:16:11

+0

最後一件事:你提到了_translations_。你什麼意思? Rails是否能夠激活關聯名稱?你想知道它在視圖中自動生成字符串嗎? – tompave 2014-10-12 23:17:47

回答

2

我會用你在問題中所定義的相同的關係,除了這部分:

class Membership < ActiveRecord::Base  
    belongs_to :family_tree 
    belongs_to :user_one, class_name: 'User' 
    belongs_to :user_two, class_name: 'User' # I actually have no idea how to call them! 
    belongs_to :relation # to hold values likes 'Son', 'Dad', etc. 
    # The model Relation would be as simple as a name and internal reference, nothing else. 
    # (internal_reference is here to solve the translation problems and other stuff you will understand with the following code) 

隨着回調after_create到反向創建的會員資格:

def create_reverse_membership 
    user_one_is_female = user_one.gender == 'female' 
    user_two_is_female = user_two.gender == 'female' 
    son_or_daughter = user_one_is_female ? :daughter : :son 
    father_or_mother = user_two_is_female ? :mother : :father 

    case relation.internal_reference.to_sym 
    when :son 
    relation = Relation.find_by_internal_reference(father_or_mother) 
    membership = Membership.where(relation_id: relation.id, user_one: user_two.id, user_two: user_one.id).first 
    if membership.present? 
     # This means the reverse membership already exists, do not call Membership.create here because it would cause and endless loop with the callback 
    else 
     membership = Membership.create(relation_id: relation.id, user_one: user_two, user_two: user_one) 
    end 
    when :father 
    # almost same logic but with `son_or_daughter` 
    when :mother 
    else 

    end 
end 

En glish不是我的母語,這段代碼可能缺乏一致性(一致性,邏輯性)。

希望這會有所幫助!

+0

'internal_reference'從哪裏來?這是一個Rails方法嗎?如果是這樣,請鏈接到它? – marcamillion 2014-10-16 06:08:58

+0

這不是一個Rails方法,它是由你(App Admin)存儲在數據庫,控制器中的一個值。因此,您可以使用相同的關係,使用internal_reference,並在需要時將其翻譯成多種語言。另外,它並不完全依賴這個詞,而不是完成'dad = Relation.where(name:'Dad')。首先,您使用internal_reference,即使對於'爸爸','父親', '爸爸'(法語)等 – MrYoshiji 2014-10-16 13:04:51

+0

'relation_name'呢,從哪裏來的呢?或者你的意思是'relation.name'?即'self.relation.name',其中'self'是'Membership'類的一個實例?另外,這是否意味着當我創建'Relation'模型時,我必須爲每個關係類型預先填充一堆記錄?即「兒子,女兒,父親,母親,祖父等」。 – marcamillion 2014-12-04 08:45:58

相關問題