微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – Rails 5:在没有模型的情况下添加记录到连接表(has_and_belongs_to_many)

我有一个User和Meetoption表.这是一个多对多关系,我能够使用create_join_table命令创建连接表:

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模型一样?

解决方法

使用has_and_belongs_to_many关系,您应该能够使用常规的Active Record关联方法将Users和Meetoptions链接在一起.您不应该直接操作连接表. Rails会为您解决这个问题. Ruby on Rails Guide has_and_belongs_to_many Association Reference列出了此关联自动创建的所有有用方法.

以下是一些您可能会觉得有用的方法.

集合<<(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 举报,一经查实,本站将立刻删除。

相关推荐