Rails 4:结合has_many:通过与多态关联相关联

时间:2015-12-14 19:08:21

标签: ruby-on-rails ruby-on-rails-4 activerecord has-many-through polymorphic-associations

在我的Rails 4应用程序中,我有以下模型:

User
has_many :administrations
has_many :calendars, through: :administrations
has_many :comments
has_many :calendar_comments, through: :calendars, :source => :comments

Calendar
has_many :administrations
has_many :users, through: :administrations
has_many :posts
has_many :comments, through: posts
has_many :ads

Administration
belongs_to :user
belongs_to :calendar

Post
belongs_to :calendar
has_many :comments, as: :commentable

Ad
belongs_to :calendar
has_many :comments, as: :commentable

Comment
belongs_to :commentable, polymorphic: true
belongs_to :user

我需要从comments belong_to ad访问calendar ad belongs_to。{/ p>

这就是我在Calendars#Index行动中尝试做的事情:

@posts_comments = @user.calendar_comments.where(commentable_type: "Post").order("created_at DESC").limit(5)
@ads_comments = @user.calendar_comments.where(commentable_type: "Ad").order("created_at DESC").limit(5)

我的第一个猜测是在日历模型中添加has_many :comments, through: ads

Calendar
has_many :administrations
has_many :users, through: :administrations
has_many :posts
has_many :comments, through: posts
has_many : ads
has_many :comments, through: ads

但这会取消has_many :comments, through: posts的效果,然后我再也无法从comments {{1}访问belong_to post的{​​{1}} }} calendar

有没有办法让 BOTH post belongs_to工作?

- - - -

更新:根据this articlethat Stack Overflow question,答案可能在于使用has_many :comments, through: postshas_many :comments, through: ads

但不确定如何使用它们。

- - - -

更新2 :以下代码是否有意义?

source:

- - - -

更新3 :当我尝试上面的代码时,收到以下错误消息:

source_type:

我尝试了以下内容:

class Calendar < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :users, through: :administrations
  has_many :posts, dependent: :destroy
  has_many :commented_posts, through: :comments, source: :commentable, source_type: 'Post'
  has_many :ads, dependent: :destroy
  has_many :commented_ads, through: :comments, source: :commentable, source_type: 'Ad'

- - - -

更新4 :使用以下代码尝试新的失败:

Could not find the source association(s) :comments in model Calendar. Try 'has_many :calendar_comments, :through => :calendars, :source => <name>'. Is it one of administrations, users, posts, commented_posts, ads, commented_ads, invites, or pokes?

仍然无效,与上述错误信息相同。

- - - -

更新5 :根据 MrYoshiji 的回答,我现在有了

class Calendar < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :users, through: :administrations
  has_many :posts, dependent: :destroy
  has_many :calendar_comments, :through => :calendars, :source => :post
  has_many :ads, dependent: :destroy
  has_many :calendar_comments, :through => :calendars, :source => :ad

现在,class Calendar < ActiveRecord::Base has_many :administrations, dependent: :destroy has_many :users, through: :administrations has_many :posts, dependent: :destroy has_many :calendar_comments, :through => :commentable, :source => :post has_many :ads, dependent: :destroy has_many :calendar_comments, :through => :commentable, :source => :ad 模型中的class Calendar < ActiveRecord::Base has_many :administrations, dependent: :destroy has_many :users, through: :administrations has_many :posts, dependent: :destroy has_many :posts_comments, through: :posts, source_type: 'Post' has_many :ads, dependent: :destroy has_many :ads_comments, through: :ads, source_type: 'Ad' 已不再有效。

我试过了:

has_many :calendar_comments, through: :calendars, :source => :comments

仍然无法正常工作。

- - - -

更新6 :我仍然遇到这个问题,因为我无法想办法让以下代码正常工作:

User

我尝试了很多不同的东西,到目前为止我能想到的最好的是:

has_many :comments
has_many :calendar_post_comments, through: :calendars, :source => :post_comments
has_many :calendar_ad_comments, through: :calendars, :source => :ad_comments

然后,我按如下方式更新我的日历控制器:

@posts_comments = @user.calendar_comments.where(commentable_type: "Post").order("created_at DESC").limit(5)
@ads_comments = @user.calendar_comments.where(commentable_type: "Ad").order("created_at DESC").limit(5)

但是这会返回以下错误:

class Calendar < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :users, through: :administrations
  has_many :posts, dependent: :destroy
  has_many :post_comments, through: :posts, source_type: 'Post'
  has_many :ads, dependent: :destroy
  has_many :ad_comments, through: :ads, source_type: 'Ad'
end

class User < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :calendars, through: :administrations
  has_many :comments
  has_many :calendar_post_comments, through: :calendars, :source => :post_comments
  has_many :calendar_ad_comments, through: :calendars, :source => :ad_comments
end

这里有什么问题?

0 个答案:

没有答案