如何将用户关系转变为新的东西?例如与广告的关系

时间:2014-12-12 23:22:13

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

我尝试根据教程在用户和广告之间建立关系。 为此,我将代码分为两个控制器:用户,广告,ads_subscriber和等效模型。我收到空数组的问题。

让我们假设一个逻辑:

user -have - list of ads. 
ad - have - list of users. 

模型/广告

class Ad < ActiveRecord::Base

has_many :reverse_ads_subscribers, foreign_key: "subscriber_id",
                               class_name:  "AdsSubscriber",
                               dependent:   :destroy
has_many :liked_ads, through: :reverse_ads_subscribers

模型/用户

class User < ActiveRecord::Base

has_many :ads_subscribers, foreign_key: "liked_ad_id", dependent: :destroy
has_many :subscribers, through: :ads_subscribers

模型/ ad_subscriber

class AdsSubscriber < ActiveRecord::Base

belongs_to :liked_ad, class_name: "User"
belongs_to :subscriber,  class_name: "Ad"

控制器/广告

def subscribers
@ad = Ad.find(params[:id])
@ads = @ad.liked_ads.paginate(page: params[:page])
end

控制器/用户

def liked_ads
@user = User.find(params[:id])
@users = @user.subscribers.paginate(page: params[:page])
end

数据库/ ads_subscribers

id | liked_ad_id | subscriber_id | created_at|
----------------------------------------------
1  | 29          | 3             | date      | 

我收到空的@users和@ads,尽管数据库已填充

1 个答案:

答案 0 :(得分:0)

如果subscriber是用户且liked_ad是广告:

class AdsSubscriber < ActiveRecord::Base
    belongs_to :liked_ad,    class_name: "Ad"
    belongs_to :subscriber,  class_name: "User"

对象类:

Class Ad < ActiveRecord::Base
    has_many     :adssubscribers, 
                 foreign_key: "liked_ad_id",
                 dependent: :destroy
    has_many     :subscribers,    through: :adssubscribers

Class User < ActiveRecord::Base
    has_many     :adssubscribers,
                 foreign_key: "subscriber_id",
                 dependent: :destroy
    has_many     :liked_ads,      through: :adssubscribers

然后,您将控制器方法保持原样:

def subscribers
    @ad = Ad.find(params[:id])
    @ads = @ad.subscribers.paginate(page: params[:page])
end

def liked_ads
    @user = User.find(params[:id])
    @users = @user.liked_ads.paginate(page: params[:page])
end