在Rails 4中使用many_to_many关系进行别名

时间:2016-01-16 21:25:41

标签: ruby-on-rails

我有两个类:UserFolder,它们使用has_many :through来创建many_to_many关系。我需要为这两个类设置别名,以便SubscriberUser的别名,SubscriptionFolder的别名。最后,我想说:

user.subscriptions 

folder.subscribers

这可行吗?目前我已经定义了一个类似

的联接类SubscriptionSubscriber
class SubscriptionSubscriber < ActiveRecord::Base
  belongs_to :subscription , class_name: "Folder"
  belongs_to :subscriber , class_name: "User"
end

并将以下代码添加到UserFolder

class User < ActiveRecord::Base
  has_many :subscription_subscribers
  has_many :subscriptions, :through => :subscription_subscribers, :class_name => "Folder", :foreign_key => "subscription_id", :source => :folder
end

class Folder < ActiveRecord::Base
  has_many :subscription_subscribers
  has_many :subscribers, :through => :subscription_subscribers, :class_name => "User", :foreign_key => "subscriber_id", :source => :user
end

这不起作用。例如,如果我运行

user.subscription

我收到以下错误

ActiveRecord::HasManyThroughSourceAssociationNotFoundError: 
Could not find the source association(s) :folder in model SubscriptionSubscriber. 
Try 'has_many :subscriptions, :through => :subscription_subscribers, :source => <name>'. 
Is it one of subscription or subscriber?

任何帮助都将受到高度赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

使用:source,我们告诉Rails在SubscriptionSubscriber模型上寻找一个名为:subscription的关联。

class User < ActiveRecord::Base
  has_many :subscription_subscribers, foreign_key: "subscriber_id"
  has_many :subscriptions, through: :subscription_subscribers, source: :subscription
end

class Folder < ActiveRecord::Base
  has_many :subscription_subscribers, foreign_key: 'subscription_id'
  has_many :subscribers, through: :subscription_subscribers, source: :subscriber
end

进行此更改后,立即尝试抓取user.subscriptions