Ruby on Rails关系模型

时间:2015-08-13 15:31:04

标签: ruby-on-rails ruby

在Ruby on Rails 4中,如何使用has_many :through ...语法在Facebook等朋友列表的关系模型中创建多对多关系?我是新手,目前正在学习Ruby on Rails 4.我看过this link

但仍然很难抓住它。

4 个答案:

答案 0 :(得分:0)

你需要一个引用关系两边的连接表

让我们说你有一个关系Post和另一个关系类别,它们之间有多对多的关系,你需要一个连接表才能代表这种关系。

连接表的迁移将是

class CreateCategoriesPosts < ActiveRecord::Migration def change create_table :categories_posts do |t| t.integer :category_id t.integer :post_id t.timestamps end add_index :categories_posts, [:category_id, :post_id] end end

并在models / post.rb中

Class Post < ActiveRecord::Base has_and_belongs_to_many :categories end 在models / category.rb中

Class Category < ActiveRecord::Base has_and_belongs_to_many :posts end

更多信息: http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

答案 1 :(得分:0)

我认为@RAF几乎已经钉了它。但是要使用OP的例子:

class User < ActiveRecord::Base
  has_and_belongs_to_many :users_list
end

class UsersList < ActiveRecord::Base
  has_and_belongs_to_many :users
end

虽然起初看起来用户应该只有一个朋友列表(UsersList),但情况可能并非总是如此。考虑UserList模型中的类型,例如:&#39;关闭朋友&#39;工作朋友&#39;所有朋友&#39;例如。

我的建议:深入研究Rails guides。这是一个值得学习和真正理解的概念(我现在仍在这样做)。

答案 2 :(得分:0)

多对多关系是一个简单的概念,但由于数据库的工作方式,使用数据库时很复杂。一个人可能有1到N个不同的朋友,这意味着数据库的单个条目需要每个条目的动态内存量,这在db世界中是禁止的。因此,您不必创建朋友的列表,而是必须创建一个代表朋友之间链接的表格,例如:

friendship.rb
class Friendship < ActiveRecord::Base
  belongs_to :friend, foreign_key: 'friend_A' # this entry has a field called 'friend_A'
  belongs_to :friend, foreign_key: 'friend_B' # this entry has a field called 'friend_B'
end

这些链接代表您的朋友网络。但是,正如之前的两个答案所提到的,Rails有一些漂亮的魔法,“has_and_belongs_to_many”,它会为你做这件事。

答案 3 :(得分:0)

注意:这里的问题是在我的StatusesController中,在索引操作中,@ relationship对象只获取所有朋友的状态,但没有获得自己的状态。有没有更好的方法来解决这个问题?我正在尝试创建一个视图来查看作为您朋友的用户的所有状态,以及您自己的状态,到目前为止,我似乎无法弄清楚如何按时间顺序排序,即使在我的状态模型中也是如此,我包括&#34; default_scope - &gt; {order(created_at :: desc)}&#34;。任何建议都将深表赞赏

class User&lt;的ActiveRecord ::基

has_many:人际关系   has_many:friends,:through =&gt; :关系

has_many:inverse_relationships,class_name:&#39; Relationship&#39;,foreign_key:&#39; friend_id&#39;   has_many:inverse_friends,through:&#39; inverse_relationships&#39;,:source =&gt; :用户端

类关系&lt;的ActiveRecord ::基

#forest_save ...   belongs_to:用户   belongs_to:friend,class_name:&#39;用户&#39;

类RelationshipsController&lt; ApplicationController中

def friend_request     user_id = current_user.id     friend_id = params [:id]     如果Relationship.where(user_id:user_id,friend_id:friend_id,接受:false).blank?       Relationship.create(user_id:user_id,friend_id:friend_id,accepted:false)

  redirect_to user_path(params[:id])
else
  redirect_to user_path(params[:id])
end

def friend_request_accept     #接受好友请求是由好友请求的收件人完成的。     #因此当前用户由to_id标识。

relationship = Relationship.where(user_id: params[:id], friend_id: current_user.id).first
if Relationship.exists?(relationship) and relationship.accepted == false
  relationship.update_attributes(accepted: true)
end

redirect_to relationships_path

def friend_request_reject     relationship = Relationship.where(user_id:params [:id],friend_id:current_user.id).first     relationship.destroy

redirect_to relationships_path

################################

def index     @relationships_pending = Relationship.where(friend_id:current_user.id,accepted:false)   端

class StatusesController&lt; ApplicationController中

def index     @status = Status.new

@relationship = Relationship.where(&#39; friend_id =?OR user_id =?&#39;,current_user.id,current_user.id)。     where(接受:true)

def new     @status = Status.new   端