我试图弄清楚这个HABTM关系问题是为了我的数据库中的用户的利益存储.兴趣表包含具有id和名称的不同兴趣列表(即:id = 1,name ='Music')
我有一个用户模型=> user.rb
has_and_belongs_to_many :interests
Run Code Online (Sandbox Code Playgroud)
和兴趣模型=> interest.rb
has_and_belongs_to_many :users
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试从复选框列表中编辑或更新用户的兴趣选择.控制器看起来像=>
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
Run Code Online (Sandbox Code Playgroud)
而param_posted函数看起来像这样
def param_posted?(sym)
request.post? and params[sym]
end
Run Code Online (Sandbox Code Playgroud)
视图逻辑如下所示:
<% for interest in @interest %>
<div>
<%= check_box_tag "user[interest_id][]", interest.id, @user.interests.include (interest) %>
<%= interest.name %>
</div>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我认为一切看起来都很犹豫但是当我运行视图时我得到了错误:
InterestController#edit中的NoMethodError …
checkbox ruby-on-rails relational-database has-and-belongs-to-many
我正在运行Rails 2.3.2并且正在执行:
class StandardWidget < ActiveRecord::Base
has_and_belongs_to_many :parts, :join_table => "widgets_parts", :association_foreign_key => "widget_custom_id"
end
class Part < ActiveRecord::Base
has_and_belongs_to_many :widgets, :join_table => "widgets_parts", :association_foreign_key => "part_custom_id"
end
p = StandardWidget.find(5)
p.widgets
Run Code Online (Sandbox Code Playgroud)
并得到错误
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'widgets_parts.standard_widget_id' in 'where clause': SELECT * FROM `widgets` INNER JOIN `widgets_parts` ON `parts`.part_custom_id = `widgets_parts`.part_custom_id WHERE (`widgets_parts`.standard_widget_id = 5 )
Run Code Online (Sandbox Code Playgroud)
我怎样才能使这个工作?
警告:如果要覆盖任一类的表名,则必须在任何has_and_belongs_to_many声明下声明table_name方法才能工作.
这是什么意思?
ruby-on-rails associations has-and-belongs-to-many tablename jointable
我一直在寻找,但找不到关于如何删除 HABTM 表中记录的好答案。我想很多人都有同样的要求。
简单地说,我有学生、班级和班级_学生
我希望学生能够放弃课程,或删除已为该学生注册该课程的 HABTM 记录。
对此必须有一个简单的答案。有谁知道它是什么?
我有以下设置。
1 个产品有多个 Product_types。许多 Product_types 有 1 种类型。根据我对文档的理解,HABTM 关系。
我的模型是
class Product < ApplicationRecord
has_and_belongs_to_many :types
end
class Type < ApplicationRecord
has_and_belongs_to_many :products
end
Run Code Online (Sandbox Code Playgroud)
我有一个这样的连接表迁移
class CreateJoinTableProductTypes < ActiveRecord::Migration[5.1]
def change
create_join_table :products, :types do |t|
t.index :product_id
t.index :type_id
end
end
end
Run Code Online (Sandbox Code Playgroud)
我已经创建了一个表单 - 希望创建正确,现在我在表单提交上发送了以下参数:
"product"=>{"name"=>"Product A", "description"=>"A cool product", "image_dir_path"=>"./",
"type"=>{"id"=>"1"}},"commit"=>"Create Product"}
Run Code Online (Sandbox Code Playgroud)
我想知道 1)提交用于在表单和控制器中创建产品的参数的最佳/rails 约定是什么?
和
2)我如何获得插入到连接表中的记录?
我有以下获取参数的方法
def product_params
params.require(:product).permit(:name, :description, :image_dir_path, :type,)
end
Run Code Online (Sandbox Code Playgroud)
但即使这样我也可以在日志中看到 :type 的未经允许的参数
目前我的控制器只有:
@product = Product.new(product_params)
Run Code Online (Sandbox Code Playgroud)
我非常感谢任何有关创建该对象的 Rails 方式的建议。我已经阅读了 HABTM 的 api …