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



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

下面是我的设置。我对Rails相当陌生。

/app/模型/membership.rb

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

/app/模型/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

如果有更好的方法来实现我所要求的,那么请告诉我。

有了这个关系数据,您的成员不需要团队名称属性——它已经可以通过团队关联获得。

通常没有理由以这种方式保持数据"同步",除非你正在执行某种计算。您不需要在Membership上存储name属性-您可以使用Team中的现有属性。

我看到有人添加重复的数据库列,因为他们不知道如何遍历关联。但除非你使用一些noSql系统,这不是"正确的方式"去做——有一个底层的SQL API(通过ActiveRecord)执行查找非常有效。


回复你的评论。这样做:

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

最新更新