2014-12-01 131 views
0

所以我有一个具有博客模型和用户模型的应用程序。has_and_belongs_to_many关联混淆

现在用户可以订阅许多不同的博客,用户也可以创建他们自己的许多博客。

这个关联会是什么样子?

现在我的模型如下所示:

Blog.rb:

class Blog < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    has_many :posts 

end 

User.rb:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, 
     :validatable 

    has_and_belongs_to_many :blogs  

    validates :email, uniqueness: true, presence: true 
    validates_presence_of :password, on: :create   

end 

用户表中有一个blog_id:整型字段,并该博客有一个user_id:整数字段。

这是正确的吗?

命令如何工作? I.E:

u = User.last 
b = u.blogs.build(title: "bla") 
b.user (shows the owner of the blog) 
b.users (shows the users that have subscribed to the blog) 

最终,我想让用户订阅其他人的博客,并创建自己的博客。

+0

你已经有了Rails 4风格和早期版本的混合。 'validates:password,presence:true,on::create'是可取的。 – tadman 2014-12-01 19:06:24

回答

2

您将要添加第三个模型“订阅”。然后,您将要使用'has_many_through:'关联。有关详细示例,请阅读导轨指南的这一部分。 http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

在创建关联之后,您将要沿着这些线做些事情: 1)确保将“订阅”路线正确嵌套在博客路径下。

resources :blogs, only: [] do 
    resources :subscriptions, only: [:create, :destroy] 

2)创建在app /视图/订阅局部一个_subscription.html.erb

3)渲染的部分在博客#表明

<%= render partial: 'subscriptions/_subscription, locals: {blog: @blog} 

4)添加到添加的能力(创建)订阅中的部分内容:(这只是添加订阅,您还需要添加删除功能)

<%= link_to [blog, Subscription.new], class: 'btn btn-primary', method: :post do %> 
    <i class="glyphicon glyphicon-star"> </i>&nbsp; Subscribe 
<% end %> 

5)添加“创建方法”来subscriptions_controller.rb

def create 
    @blog = Blog.find(params[:blog_id]) 
    subscription = current_user.subscriptions.build(blog: @blog) 

    if subscription.save 
     # Add code 
    else 
     # Add code 
    end 
    end 

这应该是足够的方向,让你的终点线。祝你好运:)

+0

谢谢!所以我通过创建属于用户和博客的订阅模型来设置HMT关联。显然,用户has_many:订阅和has_many:博客,通过:订阅和博客的相同流程。我如何真正允许用户订阅博客? – 2014-12-01 20:41:03

+0

我更新了我的答案。我没有详细介绍..但它应该给你这个想法。 – fresh5447 2014-12-01 20:59:40

+0

好的,谢谢尽可能多的细节,当你有机会的时候会很棒,但是看起来很棒。会给它一个镜头,并回来! – 2014-12-01 21:10:04