Mongoid придерживается стиля Twitter, не может указать критерии / условия для массива отношений - PullRequest
1 голос
/ 21 июня 2010

Я нахожусь в конце своего ума, пытаясь справиться с этими ошибками. По сути, я создал следующие шаблоны User и Relationship, используя Mongoid для управления моей базой данных. Это похоже на почти точную копию примера внизу страницы здесь . Я пытаюсь позвонить любому из следующих:

user1.relationships.find(:all, :conditions => {:rel_user => user_in_question, :rel_type => "following" })
user1.relationships.all(:conditions => {:rel_user => user_in_question, :rel_type => "following" })
user1.relationships.where(:rel_type => "following")
user1.relationships.following #with a named scope

Кажется, что все они просто возвращают весь массив отношений; они не ищут по критериям. Метод find () также выдает ошибку о том, что он может принимать только 1 аргумент. IM_following? Метод всегда возвращает true.

Я не уверен, лучше ли размещать код в строке или из gist, поэтому вот суть:

user.rb
user_follow_spec.rb
relationship.rb

Буду признателен за любую помощь.

Ответы [ 3 ]

1 голос
/ 22 ноября 2010

Попробуйте это:

class User

  # follows and followers
  references_many :follows, :stored_as => :array , :inverse_of => :followers ,:class_name=>"User"
  references_many :followers, :stored_as => :array , :inverse_of => :follows ,:class_name=>"User"


  def followers
    followers.map 
  end

end
1 голос
/ 29 ноября 2010

Rockmanioff, я тоже сталкивался с такой же проблемой.Возможно, вы захотите посмотреть и на .Mongoid планирует поддержку этой функции в своей версии-кандидате.На данный момент, мы должны сделать все вручную.

class User
  include Mongoid::Document
  include Mongoid::Timestamps

  references_many :fans, :stored_as => :array, :class_name => 'User', :inverse_of => :fan_of
  references_many :fan_of, :stored_as => :array, :class_name => 'User', :inverse_of => :fans

  def become_fan_of user
    fan_of << user
    self.save

    user.fans << self
    user.save
  end

  def is_a_fan? user
    fan_of_ids.include? user.id
  end

  def unfan user
    fan_of_ids.delete user.id
    self.save

    user.fan_ids.delete self.id
    user.save
  end

  ...
end 

В консоли вы можете сделать:

User.first.become_fan_of User.last
User.first.is_a_fan? User.last
User.first.unfan User.last

В вашем случае вы можете заменить "fan / fan_of" на "подписчики / подписчики соответственно ".Надеюсь, это поможет.

1 голос
/ 22 ноября 2010

Я бы посоветовал вам упростить ваши отношения, используя самоссылочные ассоциации. Проверьте мой ответ на этот вопрос:

Как: у пользователя есть поклонники

Я думаю, что это довольно близко к ассоциации, которую вы хотите:

class User
  include Mongoid::Document
  references_many :following, 
                  :class_name => 'User', 
                  :stored_as => :array, 
                  :inverse_of => :followed_by

  references_many :followed_by, 
                  :class_name => 'User', 
                  :stored_as => :array, 
                  :inverse_of => :following
end

# let's say we have users: al, ed, sports_star, movie_star    
sports_star.followed_by << al
movie_star.followed_by << al
sports_star.followed_by << ed
movie_star.followed_by << ed

movie_star.followed_by  # => al, ed
al.following            # => sports_star, movie_star
...