Kar*_*ran 10 migration ruby-on-rails associations has-and-belongs-to-many
我是rails的新手,我正试图在我的rails项目中建立多对多的关系.我有一个小策略,但我不确定它是否正确.
目标: 我有一个用户表和一个组表.用户可以是许多组的一部分,每个组可能有许多用户.
战略:
这是正确的策略吗?谢谢!
来自答案的Railcast摘要: 对于那些感兴趣的人 - Railcast建议你使用has_many:通过关联,因为上面的策略有限制,你不能添加额外的关系特定信息.
The*_*itz 17
首先,我假设您有一个带有字段"name"的用户模型和一个带有字段"name"的组模型.
您需要用户和组之间的模型.我们称之为分组:
rails g model grouping user_name:string group_name:string
Run Code Online (Sandbox Code Playgroud)
在分组模型(grouping.rb)中,您放置:
belongs_to :user
belongs_to :group
Run Code Online (Sandbox Code Playgroud)
在用户模型中:
has_many :groupings, :dependent => :destroy
has_many :groups, :through => :groupings
Run Code Online (Sandbox Code Playgroud)
在组模型中:
has_many :groupings, :dependent => :destroy
has_many :users, :through => :groupings
Run Code Online (Sandbox Code Playgroud)
在_form文件中编辑或更新用户的配置文件,您将:
<div class="field">
<%= f.label :group_names, "Groups" %>
<%= f.text_field :group_names %>
</div>
Run Code Online (Sandbox Code Playgroud)
最后,用户类必须知道如何处理表单中的信息.插入user.rb:
attr_writer :group_names
after_save :assign_groups
def group_names
@group_names || groups.map(&:name).join(' ')
end
private
def assign_groups
if @group_names
self.groups = @group_names.split(/\,/).map do |name|
if name[0..0]==" "
name=name.strip
end
name=name.downcase
Group.find_or_create_by_name(name)
end
end
end
Run Code Online (Sandbox Code Playgroud)
assign_groups删除所有单词的空白和下行,因此您不会有冗余标记.
现在,您可以在他或她的个人资料的show文件中显示用户的组:
<p>Groups:
<% @user.groups.each do |group|%>
<%= group.name %>
<% end %>
</p>
Run Code Online (Sandbox Code Playgroud)
希望,这有帮助.
归档时间: |
|
查看次数: |
13855 次 |
最近记录: |