我的第一个问题在这里!我试图将"关键公司"分配给我的用户。这些位于many-to-many
丰富的连接表中。在这个表上有属性,如new
、key
、active
等。我想将公司分配给一长串用户,为此我使用 SimpleForm
.
一切都在工作,除了我想根据丰富关系的属性过滤和限制关联关系。我为每个用户都有公司关系,但并非所有用户都是key
关系或new
关系。我只希望key
的协会出现,而不是碰其他协会。我还想在将这些公司分配给用户时将属性active
设置为true
。我的代码现在看起来像这样:
用户.rb
class User < ActiveRecord::Base
has_many :company_user_relationships
has_many :companies, through: :company_user_relationships
公司.rb
class Company < ActiveRecord::Base
has_many :company_user_relationships
has_many :users, through: :company_user_relationships
模式.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
。
如何筛选出仅影响我想要的关联?
我可以想到两种方法。
首先在关联级别对其进行筛选
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
时,它实际上在所有三个表中执行连接表,因此您可以像我的示例一样指定条件。