Ruby on rails 最佳实践:如何在具有平等访问模型的控制器中拆分关联函数
我有两种平等访问模型:用户和类别 其中每一项都应该有标准操作:索引、新建、创建、编辑、更新和销毁 但是,当我想在这两个模型之间创建关联时,我在哪里集成关联呢 我是否必须编写两次几乎相同的代码:Ruby on rails 最佳实践:如何在具有平等访问模型的控制器中拆分关联函数,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有两种平等访问模型:用户和类别 其中每一项都应该有标准操作:索引、新建、创建、编辑、更新和销毁 但是,当我想在这两个模型之间创建关联时,我在哪里集成关联呢 我是否必须编写两次几乎相同的代码: class UsersController << ApplicationController # blabla def addCategory User.find(params[:id]).categories << Category.find(params[:u
class UsersController << ApplicationController
# blabla
def addCategory
User.find(params[:id]).categories << Category.find(params[:user_id])
end
end
class CategoriessController << ApplicationController
# blabla
def addUser
Category.find(params[:id]).users << User.find(params[:user_id])
end
end
及
编辑:
我正在谈论HBTM的关系。您没有提到您是否正在使用has\u和\u属于\u many,或者您是否正在使用has\u many:through。我推荐has_many:through,它强制您使用实际的连接模型,比如UserCategory或Categorization之类的。然后你只需要创建一个新的控制器来处理它的创建 您需要将用户和类别作为参数传递给此控制器的创建操作 你的表格。。。 @category.id),:method=>:post do%> 你的控制器
class CategorizationsController < ApplicationController
def create
if Categorization.add_user_to_category(params[:user_id], params[:category_id])
...
end
end
当你想把用户发回时,问题就来了,但这并不难——检测他们从哪里来,然后把他们发回那里。或者将返回页放入表单上的隐藏字段中
希望能有所帮助。如果您需要使用has\u和\u属于\u many进行此操作,您可以采用当前使用的方法,或者将其构建到现有的更新操作中 当您添加habtm关系时,您将在类上获得一个额外的方法
class User < ActiveRecord::Base
has_and_belongs_to_many :categories
end
将设置具有这些ID的类别。如果正确命名表单字段,则如果要使用复选框或多选控件,则更新可以为您解决此问题
如果您需要一次添加一个,那么您在原始帖子中构建的方法就足够合理了。如果您认为您的重复是一种代码味道,那么您是正确的-这就是为什么您应该使用我在上一个回答中概述的方法-一个附加模型和一个附加控制器。对不起,我正在讨论HBTM关系。如果可能的话,我建议不要这样做。不过,我会发布一个关于habtm的答案,这就是我所使用的。好的,看到了对嵌套属性的支持。。。。我认为这也有助于。。。谢谢
class CategorizationsController < ApplicationController
def create
if Categorization.add_user_to_category(params[:user_id], params[:category_id])
...
end
end
class Categorization
belongs_to :user
belongs_to :category
def self.add_user_to_category(user_id, category_id)
# might want to validate that this user and category exist somehow
Categorization.new(:user_id => user_id, :category_id => category_id)
Categorization.save
end
end
class User < ActiveRecord::Base
has_and_belongs_to_many :categories
end
user = User.find(params[:id])
user.category_ids = [1,3,4,7,10]
user.save