Не показывать типы мультимедиа, которые уже существуют в порядке - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь отобразить только те типы носителей, которых нет в заказе.Ниже приведен код:

Ошибка:

**NoMethodError in Orders#building
Showing /app/views/orders/_add_media_form.html.haml where line #51 raised:
undefined method `media_type_id' for
#<ActiveRecord::Associations::CollectionProxy []>
Extracted source (around line #51):

50      - if @request.media_type_id.empty? 
51        %table.media_search_results

add_media_form.html.haml

- if @request.media_type_id.empty? 

    %table.media_search_results
      %thead
        %tr
          %th.quantity Quantity
          %th Media Type
          %th Measurement Suite
          //%th ID
      %tbody

        - @form.media_types.each do |media_type|
          %tr
            %td
              = text_field_tag "media_type_quantity[#{media_type.id}]", "",
                class: "quantity_input", type: :number, min: 0
            %td= media_type.name
            %td= media_type.measurement_suite.name

ЗаказыКонтроллер:

def building
    raise Order::CannotModifyOrder, "This order cannot be modified" unless @order.creating? || @order.stock_order?
    @form = MediaSearchForm.new params[:form]

    @request = @order.media_order_requests
    @request.each.map{|request| media_types = MediaType.where.not(id: request.media_type_id)} #where media_type.id != requests.media_type_id
    #@requests.each.map{|r| media_types = media_types.where(id != r.media_type)}
  end

Форма поиска мультимедиа:

  def media_types
    @media_types ||= if self.button.present?
      media_types = MediaType.not_hidden.active.search(self.search).includes(:measurement_suite)
      media_types = media_types.for_measurement_suite(self.measurement_suite_id) if self.measurement_suite_id.present?
      media_types = media_types.sort_by{|mt| [mt.measurement_suite.name, mt.name] }

      media_types
    end
  end

**** Если я сделаю это в форме добавления мультимедиа, онапоказывает все типы носителей на складе: **** - если @ form.media_types.present?

 %table.media_search_results
      %thead
        %tr
          %th.quantity Quantity
          %th Media Type
          %th Measurement Suite
          //%th ID
      %tbody

        - @form.media_types.each do |media_type|
          %tr
            %td
              = text_field_tag "media_type_quantity[#{media_type.id}]", "",
                class: "quantity_input", type: :number, min: 0
            %td= media_type.name
            %td= media_type.measurement_suite.name
            //%td= media_type.id

1 Ответ

0 голосов
/ 09 февраля 2019

Я думаю, что ошибка, которую вы получаете, заключается в том, что в вашем методе построения вы устанавливаете @result на @order.media_order_requests, что является <ActiveRecord::Associations::CollectionProxy []>

    @request = @order.media_order_requests

Это то, что @result будет удерживать вваш взгляд.Поэтому, когда вы вызываете @request.media_type_id.empty? по вашему мнению, вы вызываете media_type_id для <ActiveRecord::Associations::CollectionProxy []> объекта, у которого нет такого метода, и который является точным сообщением об ошибке, которое вы получаете.

В вашем методе построения у вас естьследующее утверждение после присваивания @request

@request.each.map{|request| media_types = MediaType.where.not(id: request.media_type_id)}

Похоже, вы думаете, что это утверждение изменит @request, но это не так, оно просто возвращает новый сопоставленный массивв соответствии с блоком вы даете это.Этот массив затем возвращается методом building и, вероятно, никогда не используется.

Чтобы изменить @request, вам нужно будет сделать что-то вроде @request = @request.map ..., но вам, вероятно, будет лучше установить несколько новыхпеременная, в которой, я думаю, вы пытались использовать оператор media_types = MediaType.where.not(id: request.media_type_id) в функции карты.

Есть более эффективные способы сделать это, но, поскольку мы не видим деталей наших моделей, вы можете попробовать что-то вроде этого

request_media_types = @order.media_order_requests.map { |r| r.media_type_id }  #hopefully this is a list of media_type_id's 
@media_types = MediaType.select { |mt| !request_media_types.include? mt.id } #select thos MediaType object whose id is not in the request_media_types list

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

, а затем использовать @media_types.empty? по вашему мнению

Как примечание, похоже, что вы выполняете много логики в своих представлениях, логика принадлежит моделям и контроллерам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...