【问题标题】:Rails - HABTM relationship...Storing Checkbox Values from UsersRails - HABTM 关系...存储用户的复选框值
【发布时间】:2010-01-29 21:48:14
【问题描述】:

我试图找出这个 HABTM 关系问题,以便在我的数据库中存储用户的利益。兴趣表有一个带有 id 和 name 的不同兴趣列表(即: id=1 ,name = 'Music')

我有一个用户模型 => user.rb

has_and_belongs_to_many :interests

还有一个兴趣模型 => interest.rb

has_and_belongs_to_many :users

现在我正在尝试从复选框列表中编辑或更新用户的兴趣选择。 控制器看起来像这样 =>

def edit
#@interests = Interest.find(:all)

  @title = "Edit Interest"
  @user = User.find(session[:user_id])
  @user.interest ||= Interest.new
  interest = @user.interest
  if param_posted?(:interest)
      if @user.interest.update_attributes(params[:interest])
          flash[:notice] = "Changes saved."
          redirect_to :controller => "users", :action => "index"
      end
  end
end

param_posted 函数看起来像这样

  def param_posted?(sym)
  request.post? and params[sym]
  end

视图逻辑如下所示:

<% for interest in @interest %>
<div>
<%= check_box_tag "user[interest_id][]", interest.id, @user.interests.include (interest) %>
<%= interest.name %>
</div>
<% end %>

我认为一切看起来都很干净,但是当我运行视图时出现错误:

InterestController 中的 NoMethodError#edit - # User:0x4797ddc 的未定义方法“interest”

我是否需要创建一个单独的模型/表格来将用户的兴趣与事件联系起来? 像 InterestsofUsers (id, user_id, interest_id)?我认为 HABTM 关系将消除对它的需要......

困惑

【问题讨论】:

    标签: ruby-on-rails checkbox relational-database has-and-belongs-to-many


    【解决方案1】:

    有几个问题。首先,您确实需要为兴趣和用户创建一个连接表。它的名称是两个表的组合,按字母顺序排列。它不能有主键。这是一个例子:

    class CreateInterestsUsersJoinTable < ActiveRecord::Migration
      self.up
        create_table :interests_users, :id => false do |t|
          t.integer :interest_id
          t.integer :user_id
        end
      end
    
      self.down
        drop_table :interests_users
      end
    end
    

    以这种特定方式命名连接表是 Rails 知道如何自动找到它的原因。

    另外,请记住,用户没有一个兴趣,用户有很多。这就是为什么没有 @user.interest 方法的原因。有一个@user.interests 方法,它返回一个包含该用户所有兴趣的数组,您可以根据需要循环访问。

    除此之外,我真的会让你的控制器更加 RESTful。该编辑操作尝试处理至少 2 种不同类型的请求,即编辑和更新,它们应该分开。

    在您修复此部分后,请发布另一个关于如何使您的控制器更安静的问题,我或其他人可以在这方面为您提供帮助。对于将来搜索 stackoverflow 数据库的人来说,最好将这两个问题放在单独的问题中。

    更新:关于 Rails 中多对多关系的问题经常出现,以至于我写了一篇名为 basic many-to-many associations 的文章来解释如何使用 habtmhas_many :through,以及它们之间的区别。

    【讨论】:

      【解决方案2】:
      1. 加入表-interests_users
        1. user has....to_many,所以它是复数形式,您需要在其中创建一个复选框列表
        2. 尽量遵守 RESTful 约定 :) 帖子应该转到更新方法

      【讨论】:

      • 我认为这真的只是逐点总结了我一个小时前给出的答案。
      • 是的,言简意赅……没有任何要踩你的意思,只是总结一下……
      猜你喜欢
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2017-11-13
      相关资源
      最近更新 更多