rails g migration CreateJoinTableusersmeetOptions用户meet_options
class CreateJoinTableusersmeetOptions < ActiveRecord::Migration[5.0] def change create_join_table :users,:meet_options do |t| # t.index [:user_id,:meet_option_id] # t.index [:meet_option_id,:user_id] end end end
我还使用has_and_belongs_to_many在user和option_option模型之间创建了关联
class User < ActiveRecord::Base has_and_belongs_to_many :meet_options #More codes below end
class Meetoption < ApplicationRecord has_and_belongs_to_many :users end
该关联工作正常,我可以在Rails控制台中查询例如user.meet_options.
我的问题是:加入的MeetoptionsUsers表没有模型,所以我该如何添加记录呢?现在,我必须手动添加行,即user_id = 1; meet_option_id = 2,使用GUI数据库软件(Postico).
有没有办法在Rails控制台中添加MeetoptionUser.create(user_id:1,meet_option_id:2)等记录,就像有与之关联的ActiveRecord模型一样?
解决方法
以下是一些您可能会觉得有用的方法.
集合<<(object,..)将一个或多个对象添加到连接表中.例如:
@user.meet_options << @meet_option
上面将通过在连接表中添加适当的条目,将提供的@meet_option记录与@user相关联.在这种情况下,具有user_id:@ user.id和meet_option_id:@ meet_option.id的记录将添加到连接表中.反过来完成同样的事情:
@meet_option.users << @user
另一个有用的方法是collection.delete(object,…).这允许您从连接表中删除关联.它不会删除关联的对象.例如:
@user.meet_options.delete @meet_option
以上将删除@user和@meet_option之间的关联,方法是从连接表中删除相应的记录.但是,它不会从users表中删除@user,也不会从meet_options表中删除@meet_option.
collection.destroy(object,…)与collection.delete(object,…)几乎完全相同.
collection =(objects)将根据需要通过在连接表中添加或删除来使集合仅包含提供的对象.
此关联中还有许多其他使用方法.我建议您查看链接的guide.使用这些方法,您应该能够管理连接表而无需直接操作它.让Rails和Active Record为您完成工作.
最后的想法
如果您希望通过连接模型更直接地访问连接表,则不应使用has_and_belongs_to_many关联.您可能希望在连接表中添加更多属性,或者希望在连接模型本身上进行验证或回调.在这种情况下,您应该使用has_many :through association. This blog post介绍如何设置它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。