如何使用has_many/belongs_to自动将Rails 4关联保存到两个表?

 潇湘釹子_997 发布于 2023-02-06 10:21

我的协会约有50%的工作..

我有三个表 - 用户,乐队和BandMmberships

我可以从我的视图中从两个表中提取数据库中的信息,它工作正常..

@ user.bands.each

当我在控制台中运行命令时,它会保存到band数据库和bandmemberships数据库中

user = User.first

user.bands.create(:name =>"sample")

但是,如果我在控制台中运行"preferred"命令,它将失败:

user = User.first

user.create_band(:name =>"sample")

NoMethodError:#User的未定义方法`create_band':0x007ff0b9182728

但是,如果我使用bands/new.html.erb形式,只有乐队保存在数据库中,但在关联表(bandmemberships)中没有任何内容.不知道在哪里看起来真的但我觉得我只是错过了一行代码来使它全部工作


主视图 views/users/show.html.erb

<% provide(:title, "My Dashboard") %>
<%= render @user %>

You are in <%= @user.bands.count %> bands:

<% if @user.bands.any? %> <% @user.bands.each do |band| %>

<%= render band %>

<% end %> <% else %>

You are not in any bands.

Click here to join a band

<% end %>

Bands Controller controllers/bands_controller.rb

class BandsController < ApplicationController

  def create
    @band = Band.new(strong_params)
    if @band.save
      redirect_to @band
    else
      render 'new'
    end
  end

  def new
    @band = Band.new

  end

  def show
    @band = Band.find(params[:id])

  end

  private

  def strong_params
    params.require(:band).permit(:name)
  end

end

用户控制器 controller/users_controller.rb

class UsersController < ApplicationController

  def create
    @user = User.new(strong_params)
    if @user.save
      sign_in @user
      flash[:success] = "You are now signed in"
      redirect_to @user
    else
      render 'new'
    end
  end

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
    @user.bands.build
  end


  private

    def strong_params
      params.require(:user).permit(:firstname, :lastname, :email, :password, :password_confirmation)
    end


end

用户模型 models/user.rb

class User < ActiveRecord::Base

  has_many :bandmemberships
  has_many :bands, through: :bandmemberships
  has_many :tours, through: :bands

  accepts_nested_attributes_for :bands, :tours

  before_save {self.email = email.downcase }
  before_create :create_remember_token


  validates :firstname,
            presence: true,
            length: { maximum: 50}

  validates :lastname,
            presence: true,
            length: { maximum: 50}

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :email,
            presence: true,
            format: { with: VALID_EMAIL_REGEX },
            uniqueness: { case_sensitive: false}

  has_secure_password
  validates :password,
            length: { minimum: 6 }

  def User.new_remember_token
    SecureRandom.urlsafe_base64
  end

  def User.encrypt(token)
    Digest::SHA1.hexdigest(token.to_s)
  end

  private

    def create_remember_token
      self.remember_token = User.encrypt(User.new_remember_token)
    end



end

Band Model models/band.rb.

class Band < ActiveRecord::Base

  has_many :bandmemberships
  has_many :users, through: :bandmemberships

  has_many :bandtourmemberships
  has_many :tours, through: :bandtourmemberships

  accepts_nested_attributes_for :tours
  accepts_nested_attributes_for :users

end

乐队/用户关联模型 models/bandmembership.rb

class Bandmembership < ActiveRecord::Base

  belongs_to :user
  belongs_to :band

end

CDub.. 5

has_many,你不能使用,create_object因为该方法不存在.

您将要使用user.bands.create(attributes_hash)以创建与用户关联的波段.

查看AR协会文档以has_many获取更多详细信息.

1 个回答
  • has_many,你不能使用,create_object因为该方法不存在.

    您将要使用user.bands.create(attributes_hash)以创建与用户关联的波段.

    查看AR协会文档以has_many获取更多详细信息.

    2023-02-06 10:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有