多对多关系
many to many relationship crud
我有用户,每个用户都有地址,每个地址都属于一个案例
如何添加 case new 的结果以在 case show 中显示
万一新
<%= form_for @case,:url => {:action => :create, :id => @user.id} do |f| %>
Address:<br>
<%= f.select :address_ids, options_for_select(@user.addresses.all.pluck(:name,:id)) %><br><br>
<% end %>
in case show(这给了我用户的所有地址,而不是我从 case new.html.erb
中选择的地址
<strong>Address: </strong><% @user.addresses.each do |s| %>
<%= s.name %>
<% end %>
案例模型
class Case < ActiveRecord::Base
belongs_to :user
has_many :addresses, dependent: :destroy
在用户模型中
class User < ActiveRecord::Base
has_many :cases
has_many :addresses, dependent: :destroy
在地址模型中
class Address < ActiveRecord::Base
belongs_to :user
belongs_to :case
end
它检索所有地址,因为您查询的地址来自用户本人,而不是来自您应该从 new
视图创建的案例对象。
因此,首先,我将添加 create
操作以首先创建案例(我们将为其分配所选地址):
def create
# @user can be retrieved from the passed id in the url
@user = User.last
@case = Case.create(user: @user)
@case.addresses << Address.where(id: params.require(:case)[:address_ids])
end
并将您的控制器 show
操作更改为如下所示:
def show
# @case can be retrieved any way you like, this is just an example
@case = Case.last
end
并使您的 show
视图像这样:
<strong>Address: </strong>
<% @case.addresses.each do |s| %>
<%= s.name %>
<% end %>
这将解决您的问题。
稍后要考虑的一些注意事项:
- 到目前为止这个
new
视图只允许你选择一个地址(不是多个)所以不需要使用has_many
关联(如果你想使用它,那么你必须想办法选择多个地址)。
- @user.id 可以通过 url 传递,而不是在表单中显式定义它。查看 Nested Resources 了解更多信息。
- 表单中的
url
属性可以用_path helpers代替,同上link也会给你提示
- 尽量坚持 Ruby 样式,例如缩进和命名。例如,|s|不是描述性的..最好命名为地址或地址
- 如我所见,您可以尝试使用
through
而不是复制关联。例如。案例 belongs_to 用户和案例 has_many 地址,因此用户可以 has_many 案例和用户 has_many 地址,通过::cases .. 这样你可以检索特定于该用户的地址案件。像这样,当您尝试创建一个地址并从@user.addresses 检索它时,您将得到一个错误,因为一个地址已经需要一个用户和一个案例首先被创建,所以没有设置关联非常完美,因此您将需要解决方法来防止这些错误。
我有用户,每个用户都有地址,每个地址都属于一个案例
如何添加 case new 的结果以在 case show 中显示
万一新
<%= form_for @case,:url => {:action => :create, :id => @user.id} do |f| %>
Address:<br>
<%= f.select :address_ids, options_for_select(@user.addresses.all.pluck(:name,:id)) %><br><br>
<% end %>
in case show(这给了我用户的所有地址,而不是我从 case new.html.erb
中选择的地址 <strong>Address: </strong><% @user.addresses.each do |s| %>
<%= s.name %>
<% end %>
案例模型
class Case < ActiveRecord::Base
belongs_to :user
has_many :addresses, dependent: :destroy
在用户模型中
class User < ActiveRecord::Base
has_many :cases
has_many :addresses, dependent: :destroy
在地址模型中
class Address < ActiveRecord::Base
belongs_to :user
belongs_to :case
end
它检索所有地址,因为您查询的地址来自用户本人,而不是来自您应该从 new
视图创建的案例对象。
因此,首先,我将添加 create
操作以首先创建案例(我们将为其分配所选地址):
def create
# @user can be retrieved from the passed id in the url
@user = User.last
@case = Case.create(user: @user)
@case.addresses << Address.where(id: params.require(:case)[:address_ids])
end
并将您的控制器 show
操作更改为如下所示:
def show
# @case can be retrieved any way you like, this is just an example
@case = Case.last
end
并使您的 show
视图像这样:
<strong>Address: </strong>
<% @case.addresses.each do |s| %>
<%= s.name %>
<% end %>
这将解决您的问题。
稍后要考虑的一些注意事项:
- 到目前为止这个
new
视图只允许你选择一个地址(不是多个)所以不需要使用has_many
关联(如果你想使用它,那么你必须想办法选择多个地址)。 - @user.id 可以通过 url 传递,而不是在表单中显式定义它。查看 Nested Resources 了解更多信息。
- 表单中的
url
属性可以用_path helpers代替,同上link也会给你提示 - 尽量坚持 Ruby 样式,例如缩进和命名。例如,|s|不是描述性的..最好命名为地址或地址
- 如我所见,您可以尝试使用
through
而不是复制关联。例如。案例 belongs_to 用户和案例 has_many 地址,因此用户可以 has_many 案例和用户 has_many 地址,通过::cases .. 这样你可以检索特定于该用户的地址案件。像这样,当您尝试创建一个地址并从@user.addresses 检索它时,您将得到一个错误,因为一个地址已经需要一个用户和一个案例首先被创建,所以没有设置关联非常完美,因此您将需要解决方法来防止这些错误。