Отношение Rails HABTM с несколькими элементами формы

Я работаю над проектом, в котором требуется отношение has_and_belongs_to_many.

Это включает в себя пользователей, имеющих много «предложений» и предложение, принадлежащее многим пользователям.

Это важно, так как пользователь может создать предложение и пригласить к нему других пользователей.

У меня возникли проблемы с правильной настройкой, я прочитал много других руководств и вопросов SO, но не могу их отсортировать.

Вот что у меня есть до сих пор.

User.rb

class User < ActiveRecord::Base
  has_and_belongs_to_many :proposals
 .......


Proposal.rb

class Proposal < ActiveRecord::Base
  has_and_belongs_to_many :users
...


database migration for HABTM

class CreateProposalUserJoinTable < ActiveRecord::Migration
  def change

  create_table :proposals_users, :id => false do |t|
    t.integer :user_id
    t.integer :proposal_id
  end
  end
end


/views/proposals/_form.html.erb
...
<%= f.collection_select(:users, User.all, :id, :trading_name) %>

<%= f.collection_select(:users, User.all, :id, :trading_name) %>

<%= f.collection_select(:users, User.all, :id, :trading_name) %>

...

Здесь я хочу, чтобы пользователь выбрал трех пользователей и добавил их в отношения.

Я попытался добавить эту логику в контроллер, но не могу заставить его работать правильно.

Первоначально я взломал его вместе с идентификаторами в качестве внешних ключей, но хотел бы использовать активные ассоциации записей.

[РЕДАКТИРОВАТЬ]

proposals_controller.rb
 def create
    @proposal = Proposal.new(params[:proposal])

    if current_user
     @user = current_user

     @proposal.creator_id = @user.id
     @proposal.cost = 10


    end

    respond_to do |format|
      if @proposal.save


       (params[:proposal][:users]).each do |user|
          if user.to_i.to_s == user || user.to_f.to_s == user
            puts user 
            puts "********************\n\n\n\n\n\n\n"
            @proposal.users = User.find(user)

         User.find(user).proposals << @proposal
        end
        end
        @proposal.save
        format.html { redirect_to @proposal, notice: 'proposal was successfully created.' }
        format.json { render json: @proposal, status: :created, location: @proposal }
      else
        format.html { render action: "new" }
        format.json { render json: @proposal.errors, status: :unprocessable_entity }
      end
    end

  end

person JamesWatling    schedule 27.11.2012    source источник
comment
В конце концов, это работает в консоли просто отлично, но у меня проблема с моим collection_select. Мне нужно, чтобы он возвращал пользователя, а не id пользователя... В параметрах при сбое у него есть users => 1, (для user id один), когда мне нужна модель пользователя.   -  person JamesWatling    schedule 27.11.2012
comment
Но даже если я добавлю скрытое поле для присвоения значения пользователей пользователю (id == 1), он выдает эту ошибку: неопределенный метод `каждый' для #‹User:0xb1be260›:String   -  person JamesWatling    schedule 27.11.2012


Ответы (1)


Нет необходимости назначать пользователей для предложения. Вместо этого вы также можете назначить идентификаторы, например:

proposal.user_ids = params[:proposal][:user_ids]

В следующем коде назначение выполняется автоматически:

proposal.attributes = params[:proposal]

Чтобы это работало, представление должно быть изменено следующим образом:

<%= select_tag("proposal[user_ids][]", options_from_collection_for_select(User.all, :id, :trading_name)) %>
person Yanhao    schedule 27.11.2012
comment
Я получаю этот ответ при изменении, как указано выше: «NoMethodError in ProposalsController# create undefined method `proposals’ for #‹Array:0xbde8eb4›» - person JamesWatling; 28.11.2012
comment
Я столкнулся с аналогичной проблемой с rails4. не могли бы вы мне помочь - stackoverflow.com /вопросы/24342275/ - person Harsha M V; 21.06.2014