如何在RoR中保持两个不同表的属性同步?

时间:2016-10-22 02:29:27

标签: ruby-on-rails ruby data-structures synchronization rails-activerecord

我想要的是能够轻松找到与成员资格相关联的团队名称,而无需向数据库发送另一个请求。我的计划只是将一个team_name属性添加到Memberships表中,但我想不出让这个新属性与Teams表中的name属性保持同步的方法。换句话说,我希望情况是,如果团队的所有者更改了团队的名称,那么该团队的所有成员资格也将更新(使用新的团队名称)。

以下是我的设置。我对Rails相当新。

/app/models/membership.rb

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

/app/models/team.rb

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

/app/db/schema.rb

ActiveRecord::Schema.define(version: 20161022002620) do

  create_table "memberships", force: :cascade do |t|
    t.integer  "user_id"
    t.integer  "team_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "teams", force: :cascade do |t|
    t.string  "name"
    t.integer "user_id"
  end
end

如果有更好的方法来实现我的要求,那么请让我知道。

1 个答案:

答案 0 :(得分:1)

使用此关系数据,您的成员资格不需要团队名称属性 - 它已通过团队关联提供。

通常没有理由保持数据同步&#39;这样,除非你进行某种计算。您不需要在name上存储Membership属性 - 您只需使用Team中的现有属性。

我看到人们添加重复的数据库列,因为他们不知道如何遍历关联。但是,除非你使用一些noSql系统,否则这不是正确的方法&#39;要做到这一点 - 有一个基础SQL API(通过ActiveRecord)非常有效地执行查找。

回应你的评论。这样做:

class Membership < ActiveRecord::Base
  def name
    team.name
  end
end