【问题标题】:can not create has_many through associations, how to populate the tables?无法通过关联创建 has_many,如何填充表?
【发布时间】:2017-09-12 20:33:17
【问题描述】:

我正在使用 Rails 5 创建一个 Web 应用程序,用户可以在其中创建组并将文件上传到组。我已经创建了一个用户模型、组模型和成员模型。

class User < ApplicationRecord

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
     devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable


    groupify :group_member
    groupify :named_group_member

    validates :email, :presence => true, :uniqueness => true
    has_many :members
    has_many :groups, through: :member
end

class Group < ApplicationRecord
    groupify :group, members: [:users, :assignments], default_members: :users

    has_many :members
    has_many :groups, through: :member
end

class Member < ApplicationRecord
    belongs_to :group
    belongs_to :user
end

我可以创建用户和组,但我不明白如何填写成员表。它由两列组成,user_id 和 group_id。

编辑: 这些是我的迁移文件

class CreateMembers < ActiveRecord::Migration[5.0]
  def change
    create_table :members do |t|
      t.integer :user_id
      t.integer :group_id

      t.timestamps
    end
    add_index :members , [:user_id,:group_id]
  end
end
class DeviseCreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name ,              null: false
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      t.string   :reset_password_token
      t.datetime :reset_password_sent_at
      t.datetime :remember_created_at
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip


      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
  end
end

我的 users 表中没有 group_id,它只存在于 groups 和 member 表中。

【问题讨论】:

    标签: ruby-on-rails sqlite activerecord


    【解决方案1】:

    有两种方法。

    1) 创建会员

    Member.create(user_id: user_id, group_id: group_id)
    

    2) 在 User.groups_ids 中添加 Group id

    ids = user.groups_ids
    ids.push(group_id)
    user.groups_ids = ids
    

    【讨论】:

    • 或者只是user.groups_ids &lt;&lt; group_id,而不是那三行。而且这个会立即保存到数据库中,所以你不必执行user.save 什么的。
    • 我如何提取我选择添加成员的组的 group_id?因为每个用户可能有多个组。
    • 我的用户表中没有 group_id。我还能用上面的说法吗?而这一切都将在 user_controller 或 group_controller 中?
    • 如果用户通过成员访问组,用户有groups_ids。
    【解决方案2】:

    through应该是复数

    through: :members
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-21
      • 2016-04-02
      • 2023-04-04
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多