加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:07:55 所属栏目:百科 来源:网络整理
导读:我有一个User和MeetOption表.这是一个多对多关系,我能够使用create_join_table命令创建连接表: rails g migration CreateJoinTableUsersMeetOptions用户meet_options 这会生成一个迁移文件: class CreateJoinTableUsersMeetOptions ActiveRecord::Migratio
我有一个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介绍如何设置它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读