所以基本上,我的应用程序包含有朋友(单方面访问)和拥有列表的用户(模型用户)。
我在这里想要实现的是在创建一个新列表时,为它提供从用户的朋友中挑选的“访问器”。
我的代码深受以下关于虚拟属性的railscast的启发。
所以,我的 User 和 UserAccessor 模型来了(只是相关部分):
class User < ActiveRecord::Base
has_many :lists, :dependent => :destroy
has_many :friendships, :dependent => :destroy
has_many :friends, :through => :friendships
end
class UserAccessor < ActiveRecord::Base
belongs_to :accessor, :class_name => "User"
belongs_to :accessible_list, :class_name => "List"
end
我的列表模型:
class List < ActiveRecord::Base
has_many :items
belongs_to :user
has_many :user_accessors, :foreign_key => "accessible_list_id", :dependent => :destroy
has_many :accessors, :class_name => "User", :through => :user_accessors
validates :title, :presence => true, :length => { :minimum => 1 }
attr_writer :authorized_users
after_save :add_accessors
def authorized_users
@authorized_users || self.accessors.map(&:username).join(' ')
end
private
def add_accessors
if @authorized_users
accessors = @authorized_users.split(' ').map do |username|
user = User.find_by_username(username)
if user
if self.user.inverse_friends.include? user
self.user_accessors.build(:accessor_id => user.id).accessor
end
end
end
end
end
end
用于创建或更新列表的表单如下:
= simple_form_for [@user, @list] do |f|
= f.input :title, :label => "Titre"
= f.input :authorized_users, :label => "Authorized users", :hint => "Separated by spaces"
%p
= f.button :submit
所以我的问题来自这样一个事实,即我不确切知道如何创建/更新访问器,我的代码self.user_accessors.build(:accessor_id => user.id).accessor
肯定无法正确填充它。
我仍然是 Rails 的菜鸟(和一般的 ruby ......),所以我希望我放在那里的内容足够相关,可以帮助我!提前致谢!