我想要的是能够轻松地找到与成员关联的团队名称,而无需向数据库发送另一个请求。我的计划是只向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