如何填充has_many:through模型表

时间:2015-08-26 01:50:08

标签: ruby-on-rails

我的模特:

class Event < ActiveRecord::Base
  belongs_to :organization
  has_many :directors
  has_many :vips, :through => :directors
end

class Vip < ActiveRecord::Base
    belongs_to :organization
    has_many :directors
    has_many :events, :through => :directors
end

class Director < ActiveRecord::Base
  belongs_to :vip
  belongs_to :event
end

我的新活动表格

<%= form_for [@organization, @event] do |f| %>
    <p>
        <%= f.label :when %>
        <%= f.date_select :when %>
    </p>
    <p>
        <%= f.label :name %>
        <%= f.text_field :name %>
    </p>
    <p>
        <%= f.label :vip %>
        <%= f.select :vip_id, options_for_select(@organization.vips.all.map {|v| [v.name, v.id]}) %>
    </p>
    <p>
        <%= f.submit %>
    </p>
<% end %>

我的事件控制器:

    def new
        @organization = Organization.find(params[:organization_id])
        @event = @organization.events.new
        @director = Director.new
    end

    def create
        @organization = Organization.find(params[:organization_id])
        @event = @organization.events.build(event_params)

        if @event.save 
            redirect_to organization_path(@organization)
        else
            render 'new'
        end
    end

所以,我的Vips是在流程的早期创建的,并且位于vips表中。当我提交新的活动表格时,我得到了一个新的活动表条目。 我想要做的事情是在我提交新活动表单时,我的导演表会填充新条目。 director表需要我刚刚创建的事件的event_id,以及表单中select标签的vip_id。

我考虑将此添加到创建操作

def create  
    @director = Director.new

    if @event.save
      redirect_to organization_path(@organization)
      @director.vip_id = @event.vip_id
      @director.event_id = @event.id

但这并未创建导演表的条目。有没有办法做到这一点,我没有看到?

1 个答案:

答案 0 :(得分:0)

    Map<String, String> stringMap = new HashMap<>();    
    stringMap.put("username", "yourusername");
    stringMap.put("password", "yourpassword");
    ...
    String requestBody = buildRequestBody(stringMap);

所以,你有这两项任务, @director.vip_id = @event.vip_id @director.event_id = @event.id 这一项很好,因为你刚刚创建了这个事件而你有@director.event_id = @event.id

但是,第一个不起作用。查看您的模型关联,@event.id没有@event,因此您无法调用vip_id。您必须通过@event.vip_id转到vip,例如:

organization

或,@event.organization.vips.first.vip_id这也可以用@event.vips.first.vip_id关联。

这两个是我看到获得与事件相对应的有效:through => :directors的唯一方式。虽然,这只会获得第一个vip_id,或者您可以在vip_id子句中指定一些条件来获取该事件的特定where

如果这对你有用,那很好。否则,您可能需要重新考虑模型之间的关联。