在Ruby on Rails 4中,如何使用has_many :through ...
语法在Facebook等朋友列表的关系模型中创建多对多关系?我是新手,目前正在学习Ruby on Rails 4.我看过this link。
但仍然很难抓住它。
答案 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 端
端
#