以下是我的模特。用文字来形容它,'Show'有'Crew'。 '船员'由'人'组成。 'Show'和'Crew'中的'People'之间的关联可以是'Actor'或'Other'。 我有来自“显示”表单上的自动完成UI的令牌,其中“人物”填充在“演员”字段或“其他”字段中。
问题:
在“显示”模型中的actor_tokens=(ids)
和actor_tokens=(ids)
方法中,我保存了令牌,我如何将关系保存为“演员”或“其他”?
从actor_tokens=(ids)
保存的所有关联都应该是'actor'类型
从other_tokens=(ids)
保存的所有关联都应为“其他”类型和
我正在寻找一个优雅的解决方案来匹配使用* collection_singular_ids = ids *来保存我的令牌。
船员模型
class Crew < ActiveRecord::Base
belongs_to :show
belongs_to :person
attr_accessor :type #this can be 'actor' 'other' string
end
人物模型
class Person < ActiveRecord::Base
attr_accessible :first_name, :handle, :last_name
has_many :crews
has_many :shows, :through => :crews
end
显示模型
class Show < ActiveRecord::Base
attr_accessible :handle, :name, :crew_tokens
has_many :crews
has_many :people, :through => :crews
attr_reader :actor_tokens
def actor_tokens=(ids)
self.person_ids = ids.split(",")
#----->associate tokens coming in here as type = 'actor'
end
def other_tokens=(ids)
self.person_ids = ids.split(",")
#----->associate tokens coming in here as type = 'other'
end
end
PS:请为这篇文章建议一个更好的标题!
谢谢!
答案 0 :(得分:1)
您无法使用collection_singular_ids=
以您想要的方式创建新的Crew
个实例。 ids_writer
仅接受有效的,已存在的ID列表;你不能通过这种方法指定其他属性。
相反,您可以构建Crew
个实例,根据需要指定:person_id
和:type
,然后将它们关联回Show
的实例。
def actor_tokens(ids)
create_crews_from_ids(ids, :actor)
end
def other_tokens=(ids)
create_crews_from_ids(ids, :other)
end
private
def create_crews_from_ids(ids, type)
ids = ids.split(",").each do |id|
crews.create({ person_id: id, type: type })
end
end