2016-07-15 8 views
1

первый вопрос для меня здесь! Я пытаюсь назначить «ключевые компании» своим пользователям. Они находятся в таблице обогащенных соединений many-to-many. На этой таблице есть такие атрибуты, как new, key, active и так далее. Я хочу назначить компании пользователям в длинном списке, и для этого я использую SimpleForm.Ограниченная ассоциация, основанная на атрибутах богатого отношения

Все работает за исключением того, что я хочу отфильтровать и ограничить связь ассоциации на основе атрибутов в отношении богатых. У меня есть отношения компании для каждого пользователя, но не все из них - это отношение key или отношение new. Я хочу, чтобы ассоциация была key, чтобы отображать и не касаться других. Я также хочу установить атрибут active на true, когда я назначаю эти компании пользователям. Мой код будет выглядеть так:

user.rb

class User < ActiveRecord::Base 
    has_many :company_user_relationships 
    has_many :companies, through: :company_user_relationships 

company.rb

class Company < ActiveRecord::Base 
    has_many :company_user_relationships 
    has_many :users, through: :company_user_relationships 

schema.rb

create_table "company_user_relationships", force: true do |t| 
    t.integer "company_id" 
    t.integer "user_id" 
    t.boolean "key" 
    t.boolean "active" 
    t.datetime "last_contacted" 
    t.string "status_comment" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "status" 
    t.boolean "new" 
end 

users_controller.rb

def assign_key_companies 
    User.update(params[:users].keys, params[:users].values) 
    redirect_to(:back) 
end 

вид

= form_for :user_companies, 
     url: assign_key_companies_users_path, 
     html: {:method => :put} do |f| 
    - users.each do |user| 
    = simple_fields_for "users[]", user do |u| 
     tr 
     td.col-md-4 
      = "#{user.first_name} #{user.last_name}" 
     td.col-md-8 
      = u.association :companies, label: false, collection: @key_company_candidates, 
         input_html: {data: {placeholder: " Assign key companies"}, class: 'chosen-select'} 
    = submit_tag "Save key companies", class: "btn btn-success pull-right" 

Я в принципе хочу только показать user.companies.where(key: true) и SQL COMMIT всегда ставить key -поле к true при обновлении записи.

Как я могу отфильтровать, чтобы влиять только на ассоциации, которые я хочу?

ответ

0

Я могу думать о двух путях.

Во-первых, чтобы фильтровать на уровне ассоциации

class User < ActiveRecord::Base 
    has_many :company_user_relationships, -> { where("company_user_relationships.key" => true) } 

Или где

user.companies.where("company_user_relationships.key" => true) 

Когда вы звоните user.companies он фактически делает таблицу соединения среди всех трех таблиц, так что вы можете указать условие как мой пример.

+0

Спасибо! Я нашел способ добавить еще одно отношение has_many, которое показывало только ключевые отношения, вроде первого примера, который вы показали. Через магию рельсов он автоматически установил все свойства для меня, когда я назначил их массе :) – feggak