Rails显示没有外键关系的对象

时间:2013-09-12 01:20:48

标签: ruby-on-rails ruby ruby-on-rails-4 foreign-key-relationship

我整天都在试着做一些我觉得可能非常简单的事情。我有一个用户模型,其中用户可以与另一个名为兴趣的模型建立关系(通过跟随或取消关注)。

在我的主页上,我想显示@user或current_user不“关注”的所有兴趣。

我一直在我的控制器中尝试各种变体:

@interests = Interest.all.where(:current_user.following => nil)

显然,这不会起作用,因为“where”似乎严格搜索数据库列,而我的关系模型不会在Interest表中留下任何足迹。有趣的是,我可以通过一个简单的

轻松显示我的用户所关注的所有兴趣
@interests = current_user.following

我猜我可能不得不为我的模型和控制器编写新的资源和代码,用于“不遵循”方法或路由。但作为Rails的新手,我不知道那会是什么样子,我似乎无法在Stack或其他地方找到任何帮助。

更新

根据要求,这是用户模型:

class User < ActiveRecord::Base
before_save { self.email = email.downcase }
before_create :create_remember_token

validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, 
          format: { with: VALID_EMAIL_REGEX },
          uniqueness: { case_sensitive: false }
   validates :address, presence: true
    has_secure_password
    validates :password, length: { minimum: 6 }

  has_many :relationships, :foreign_key => "follower_id",
                        :dependent => :destroy   
  has_many :following, :through => :relationships, :source => :followed 

  geocoded_by :address do |user,results|
    if geo = results.first
      user.city = geo.city
    end
  end  
  after_validation :geocode, :if => :address_changed?

  def following?(interest)
    relationships.find_by(followed_id: interest.id)
  end

  def follow!(interest)
    relationships.create!(followed_id: interest.id)
  end

  def unfollow!(interest)
    relationships.find_by(followed_id: interest.id).destroy!
  end

以下是兴趣模型:

class Interest < ActiveRecord::Base

  has_many :relationships, :foreign_key => "followed_id",
                        :class_name => "relationship"
  has_many :followers, :through => :reverse_relationships, 
                    :source => :follower   

  has_many :followed_users, through: :relationships, source: :followed

3 个答案:

答案 0 :(得分:1)

理想情况下,您应该拥有一个具有所有可能兴趣的模型。

但是,你可以在当前场景中使用distinct上的基本数组减法和Interests查询来解决它。

all_interests = Interests.select("distinct interest_type").map{|item| item.interest_type}
user_interests = current_user.following
not_followed_interests = all_interests - user_interests

答案 1 :(得分:1)

我不确定您的Interest模型是什么样的或following返回的是什么,但我认为这样的事情应该有效:

Interest.where('interest_id not in (?)', current_user.following.map(&:id))

答案 2 :(得分:1)

只是评论@Ayman的回答:

  

我不确定您的兴趣模型是什么样的或者是什么样的   以下返回,但我认为这样的事情应该有效:

     

Interest.where('interest_id不在(?)',   current_user.following.map(安培;:ID))

您可以尝试将此查询与pluck方法一起使用:

Interest.where("interest_id NOT IN (?)", current_user.following.pluck(:id))