Rails:使用collection_singular_ids = ids方法保存令牌时指定关联类型

时间:2012-08-29 23:09:07

标签: ruby-on-rails ruby-on-rails-3 activerecord

以下是我的模特。用文字来形容它,'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:请为这篇文章建议一个更好的标题!

谢谢!

1 个答案:

答案 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