2016-07-15 17 views
1

erste Frage für mich hier! Ich versuche meinen Kunden "Schlüsselunternehmen" zuzuweisen. Diese werden in einer Rich-Join-Tabelle many-to-many gefunden. Auf dieser Tabelle befinden sich Attribute wie new, key, active und so weiter. Ich möchte Unternehmen zu Benutzern in einer langen Liste zuweisen und dafür mit SimpleForm.Begrenzen der Assoziation basierend auf Rich Relationship-Attributen

Alles funktioniert, ausgenommen, dass ich herausfiltern und die Assoziationsbeziehung basierend auf den Attributen auf der Rich-Beziehung begrenzen möchte. Ich habe Firmenbeziehungen für jeden Benutzer, aber nicht alle von ihnen sind eine key-Beziehung oder eine new-Beziehung zum Beispiel. Ich möchte nur, dass die Verbindung key angezeigt wird und nicht die anderen berühren. Ich möchte auch das Attribut active zu true setzen, wenn ich diese Firmen den Benutzern zuordne. Mein Code sieht wie folgt nun:

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 

Ansicht

= 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" 

ich im Grunde nur user.companies.where(key: true) und die SQL-COMMIT immer die key -field zu true zeigen will, setzen, wenn die Aufzeichnung zu aktualisieren.

Wie kann ich herausfiltern, um nur die Vereinigungen zu beeinflussen, die ich will?

Antwort

0

Ich kann mir zwei Möglichkeiten vorstellen.

Zuerst es auf Verbandsebene filtern

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

Oder wo

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

Wenn Sie user.companies nennen es tatsächlich die Tabelle unter allen drei Tabellen verknüpfen tun, so dass Sie die Bedingung angeben könnten wie mein Beispiel.

+0

Vielen Dank! Ich habe eine Möglichkeit gefunden, eine weitere has_many-Beziehung hinzuzufügen, die nur Schlüsselbeziehungen zeigt, ähnlich wie das erste Beispiel, das Sie gezeigt haben. Durch rails magic stellt es dann automatisch alle Eigenschaften für mich her, wenn ich sie massenweise zugewiesen habe :) – feggak