为has和属于多个关联创建中间模型

时间:2019-03-04 07:37:59

标签: ruby-on-rails

我在两个模型之间有一个has_and_belongs_to_many关系。

class DirectoryListing 
 has_and_belongs_to_many :directory_listing_categories

end

class DirectoryListingCategory
 has_and_belongs_to_many :directory_listings

end

这创建了两个表directory_listingsdirectory_listing_categories

和中间的第三个表,名为 directory_listing_categories_directory_listings

我可以使用活动记录查询从控制台访问前两个表。 由于此关系不会为中间的第三张表创建第三张模型,因此我无法从Rails控制台访问第三张中间表。

我尝试为此创建模型,但未成功。

这是访问第三张表的正确方法吗?

class DirectoryListingCategoryDirectoryListing < ActiveRecord::Base

end

2 个答案:

答案 0 :(得分:0)

首先,要在控制台中访问表,必须在应用程序中创建一个与表名称相同的模型。

第二,如果要创建中间表的记录,则应通过在控制台中执行原始查询来创建它,

ActiveRecord::Base.connection.execute('your insert into query goes here')

答案 1 :(得分:0)

我最近创建了一个小应用程序,在其中我必须存储一些角色并将其映射到用户。设置为:

  1. User模型对应于users表。
  2. Role模型对应于roles表。
  3. 我需要一个表来进行多对多映射。

我为创建关联表而编写的迁移是这样的:

class CreateUserRoleJoinTable < ActiveRecord::Migration[5.2]
  def up
    create_join_table :users, :roles
  end

  def down
    drop_join_table :users, :roles
  end
end

运行迁移时,Rails创建了一个roles_users。如果需要,还可以在up方法中添加foreign_keys和唯一索引。

模型就像:

用户

class User < ApplicationRecord
  has_and_belongs_to_many :roles
end

角色

class Role < ApplicationRecord
  has_and_belongs_to_many :users
end

所以它几乎是同一种设置。

此设置为我提供了有关User对象的以下方法(由下面的user对象表示:

  1. user.role_ids :这将获取该用户所关联角色的角色ID。
  2. user.role_ids= :这将允许我同时使用分配和数组插入与用户设置角色。像这样:
    user.role_ids = 1 # Assuming there are no roles already associated with the user
    user.role_ids = [2,6] # This will remove the previously assigned role (with ID = 1) and assign the roles with IDs 2 & 6 to the user
    user.role_ids << 5 # This will add the role ID 5 to the user (final role_ids at this point will be [2,5,6]
    
  3. user.roles :这类似于user.role_ids,但会获取我的Role对象而不是ID。
  4. user.roles= :再次类似于user.role_ids=,但将使用对象而不是ID。

对于角色模型,我得到role.user_idsrole.user_ids=role.usersrole.users=

重点是-我很少需要触摸roles_users表。

如果这样做,我可以执行 User.connection.execute(sql) 并手动读取结果。否则,自动注入的方法就足够了。

我希望这会有所帮助。