首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何优雅地处理与Rails翻译的双边关系?

如何优雅地处理与Rails翻译的双边关系?
EN

Stack Overflow用户
提问于 2014-10-09 21:04:08
回答 1查看 281关注 0票数 9

我有一个family_tree,有人可以把他们的亲戚添加到树上。

因此,为每个membership条目创建了一个family_tree记录。

但是,如果Son添加了一个Dad,我们应该能够更新爸爸的族谱,以便在视图中将“子”添加到树中。什么是最好的Rails方法来解决这个问题?我知道Rails做了很多本地的翻译,以及多元化的翻译等等。不管怎样,对于我来说,这是我想要做的事情?

另外,处理这些东西的类/模块是什么?ActiveSupport?

这是我的User模型:

代码语言:javascript
运行
复制
# == 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

代码语言:javascript
运行
复制
# == 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

代码语言:javascript
运行
复制
# == 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

代码语言:javascript
运行
复制
# == 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看起来如下(为了简洁而截断):

代码语言:javascript
运行
复制
      <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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-15 19:08:45

我会使用您在问题中定义的相同关系,但本部分除外:

代码语言:javascript
运行
复制
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来逆转创建的成员身份:

代码语言:javascript
运行
复制
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

英语不是我的母语,这段代码可能缺乏一致性(连贯性,逻辑性)。

希望这能有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26287887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档