0

现在已经两天了,我阅读博客、观看铁路广播、阅读书籍等,但我找不到一个优雅的解决方案来解决我的问题。

上下文:我有多个业务,可以有多个contact_persons。此外,每个企业必须始终有一个主要联系人。所以我通过business_contact_persons 表在business 和contact_person 之间建立了多对多的关系。

class Business < AR
has_many :business_contact_persons, :dependent => :destroy
has_many :contact_persons, :through => :business_contact_persons


class ContactPersons < AR
has_many :business_contact_persons, :dependent => :destroy
has_many :business, :through => :business_contact_persons


class BusinessContactPerson < AR
belongs_to :business
belongs_to :contact_person

#Primary is a boolean in the database
attr_accessible :primary, :contact_id, :business_id

现在,我试图在我的业务视图中实现的是允许用户选择他们想要分配特定业务的每个contact_person,并且选择他们想要成为主要联系人的人。因此,在我的新业务视图中,我可以显示一组复选框,显示所有可用的contact_persons,以及一个带有相同contact_persons 列表的radio_button 组来选择主要的。

为了节省业务,我在我的控制器中使用它:

@business.attributes = params[:business]

它适用于保存 business_contact_persons 因为它访问属性槽

params[:business][:contact_person_ids]

但这不会将我的主要 business_contact_persons 布尔字段分配给用户选择的字段。更糟糕的是,我将如何处理编辑业务,因为用户可以更改业务的主要联系人。

另外,关于如何验证企业是否分配了主要联系人的想法会非常好

4

1 回答 1

1

实现此目的的一种方法是使用 Rails 表单标签助手。

创建您自己的选择标签:

您可以使用自己的名称创建自己的选择标签,例如“bcp”表示业务联系人。您可以创建自己的选项,并且有从集合创建选项的快捷方式。

控制器:

在您的控制器中,您将获得参数:

bcp = BusinessContactPerson.find(params[:bcp])
bcp.primary = true
bcp.save!

Rails 有很多帮助器来构建你自己的表单:

http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-select_tag

before_validation:

您将在验证业务模型之前创建/更新 BCP。

您可能想查看 ActiveRecord #before_validation 回调。

另请参阅 #inverse_of 设置以确保 #belongs_to 找到相同的记录。

(我不确定这一切都会奏效——这些是我会尝试的起点)

于 2012-09-20T04:27:32.613 回答