2014-01-14 3 views
0

Сводка Я хочу исключить некоторые варианты выбора при использовании collection_select. Например, при добавлении нового company_code (table = Company_Listings) для данной компании (table = Companies), которая для раскрывающегося списка обмена (таблица = обмены) заменяет только те, что его данная компания НЕ указана. Информация о параметрах также может быть введена для компании (опять же на столе = Company_Listings).ruby-on-rails collection_select исключить некоторые выборы

Подробнее.

General У меня есть экран, на котором можно ввести информацию о компании. Я допускаю, чтобы компания была зарегистрирована на нескольких биржах. Я также разрешаю вводить информацию о параметрах. Например, Broken Hill Pty зарегистрирован на Австралийской фондовой бирже (ASX) в качестве BHP, а также на Лондонской фондовой бирже (LSE) в качестве BIL. Кроме того, для каждой биржи можно добавить несколько вариантов.
Эта информация хранится в таблицах компаний и компаний (таблица ниже).

Пример - то, что я пытаюсь сделать
1- Список бирж = ASX, LSE, AMEX, NYSE
2- компаний таблица Компания = Брокен Хилл Pty Ltd
3- Company_Listings стол - Брокен-Хилл Pty Ltd, зарегистрированная как на ASX (Австралийская фондовая биржа), так и на LSE (Лондонская фондовая биржа)
например на ASX = BHP и на LSE = BIL
4 При переходе на страницу «Списки компаний» для BHP я хочу, чтобы выпадающий список «Список Exchange» отображал только AMEX и NYSE (для исключений ASX и LSE).

Столы

table "companies" do |t| 
    t.string "name" 
    t.string "full_name" 
    t.integer "exchange_id" 

create_table "company_listings" do |t| 
    t.integer "company_id" 
    t.integer "share_number"   
    t.integer "share_price" 
t.string "option_name" 
t.integer "option_strike_price" 
t.date  "option_expiration_date" 
t.integer "exchange_id" 
t.string "company_code" 

table "exchanges" do |t| 
    t.string "name" 
    t.string "full_name" 

Из кода для этого экрана - то, что мне нужно изменить

<%= f.hidden_field :company_id %> 
    <%= content_tag :tr do %> 
    <%= content_tag :td, content_tag(:span, "Listed Exchange"), 
     class: 'very_large_column' %> 
    <%= content_tag :td, f.collection_select(:exchange_id, Exchange.order(:id), 
      :id, :name, {}, {class: "input-fullwidth"}), class: 'data small_column' %> 
    <% end %> 
    <%= content_tag :tr do %> 
    <%= content_tag :td, content_tag(:span, "Stock Code"), 
     class: 'very_large_column' %> 
    <%= content_tag :td, f.text_field(:company_code, 
     class: 'small_column'), class: 'data' %> 

Модели

class CompanyListing < ActiveRecord::Base 
    ... 
    belongs_to :company 
    belongs_to :exchange 
    ... 
end 


class Exchange < ActiveRecord::Base 
    ... 
    has_many :company_listings, dependent: :destroy 
end 

ответ

1

Третий парам для collection_select является сбор. Вместо того, чтобы использовать это значение Exchange.order(:id), вы можете применить его к логике на основе идентификатора компании. В качестве примера:

class Exchange < ActiveRecord::Base 
    def self.not_listed_for_company_id(company) 
    # AR scope that retrieves all exchanges that the company is NOT listed on 
    # NOTE: This can be made more efficient since company.exchanges will result in additional database queries 
    Exchange.where("id not in (?)", company.exchanges.collect{|e| e.id}) 
    end 
end 

Тогда, по мнению:

<%= content_tag :td, f.collection_select(:exchange_id, Exchange.not_listed_for_company_id(company), 
     :id, :name, {}, {class: "input-fullwidth"}), class: 'data small_column' %> 
+0

спасибо - пытаются получить эту работу прямо сейчас. Не слишком уверен, как отформатировать область в self.not_listed_for_company – user1854802

+0

thanks - steakchaser – user1854802

0

Коллега, Tristian, при условии, этот ответ. По мнению

<%= content_tag :td, f.collection_select(:exchange_id, Exchange.order(:id), 
      :id, :name, {}, {class: "smallish_column"}), class: 'data' %> 

становится

<%= content_tag :td, f.collection_select(:exchange_id, 
      Exchange.where.not(id: @company.company_listings.where.not(company_code: nil).pluck(:exchange_id)).order(:id), 
      :id, :name, {}, {class: "input-fullwidth"}), class: 'data column' %> 

благодаря Pierre

Смежные вопросы