我想要的是能够轻松找到与成员资格相关联的团队名称,而无需向数据库发送另一个请求。我的计划只是将一个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
如果有更好的方法来实现我的要求,那么请让我知道。
答案 0 :(得分:1)
使用此关系数据,您的成员资格不需要团队名称属性 - 它已通过团队关联提供。
通常没有理由保持数据同步&#39;这样,除非你进行某种计算。您不需要在name
上存储Membership
属性 - 您只需使用Team
中的现有属性。
我看到人们添加重复的数据库列,因为他们不知道如何遍历关联。但是,除非你使用一些noSql系统,否则这不是正确的方法&#39;要做到这一点 - 有一个基础SQL API(通过ActiveRecord)非常有效地执行查找。
回应你的评论。这样做:
class Membership < ActiveRecord::Base
def name
team.name
end
end