多对多关系

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 %>

这将解决您的问题。


稍后要考虑的一些注意事项:

  1. 到目前为止这个new视图只允许你选择一个地址(不是多个)所以不需要使用has_many关联(如果你想使用它,那么你必须想办法选择多个地址)。
  2. @user.id 可以通过 url 传递,而不是在表单中显式定义它。查看 Nested Resources 了解更多信息。
  3. 表单中的url属性可以用_path helpers代替,同上link也会给你提示
  4. 尽量坚持 Ruby 样式,例如缩进和命名。例如,|s|不是描述性的..最好命名为地址或地址
  5. 如我所见,您可以尝试使用 through 而不是复制关联。例如。案例 belongs_to 用户和案例 has_many 地址,因此用户可以 has_many 案例和用户 has_many 地址,通过::cases .. 这样你可以检索特定于该用户的地址案件。像这样,当您尝试创建一个地址并从@user.addresses 检索它时,您将得到一个错误,因为一个地址已经需要一个用户和一个案例首先被创建,所以没有设置关联非常完美,因此您将需要解决方法来防止这些错误。