需要一些JSON API结构的帮助。
说我们有以下内容:
class User < ApplicationRecord
has_many :posts
end
class Post < ApplicationRecord
has_many :comments
belongs_to :user
end
class Comment < ApplicationRecord
belongs_to :post
has_many :talkbacks
end
class Talkbacks < ApplicationRecord
belongs_to :comment
end
现在,api点应该类似于以下内容:
/posts
/posts/:id
/posts/:id/comments
/comments
/comments/:id
/comments/:id/talkbacks
/talkbacks
/talkbacks/:id
如果我们想展示帖子,假设我们有一个令牌,那么确保帖子属于当前用户很容易:
# /posts/:id
current_user.posts.find_by_id!(params_id)
但是,如果我们想要显示特定的对讲,那么确保对讲属于用户就更加困难了:
# /talkbacks/:id
确保用户可以访问该对讲的最佳方法是什么?
答案 0 :(得分:2)
你应该用has_one, through
关系充实你的关系。然后,它很容易执行查询。您不需要将user_id添加到任务字段(并且不应该因为帖子应该处理该关联)。 has_one
关系允许您通过其他模型有效地建立belongs_to
关系,并且无需使用连接表。
class User < ApplicationRecord
has_many :posts
has_many :comments, through: :posts
has_many :talkbacks, through: :comments
end
class Post < ApplicationRecord
belongs_to :user
has_many :comments
has_many :tasks, through: :comments
end
class Comment < ApplicationRecord
belongs_to :post
has_one :user, through: :post
has_many :talkbacks
end
class Talkbacks < ApplicationRecord
belongs_to :comment
has_one :user, through: :comment
end
然后你可以在你的控制器中做到
current_user.talkbacks.find(params[:id])
在你的帖子中放在一边...
current_user.posts.find_by_id!(params_id)
posts.find_by_id!()
相当于posts.find()
,因此您不需要执行by_id!
部分。默认情况下,如果Rails无法使用find
方法查找记录,则会引发异常,与使用find_by_id
方法上的爆炸相同。
答案 1 :(得分:1)
您可以尝试这样的事情:
talkback = Talkback.find(params[:id])
if talkback
if talkback.comment.post.user == current_user
# do stuff
else
# talkback doesn't belong to signed in user
end
else
# no talkback exists with that id in the database
end
或者您可以将该逻辑封装在模型中并使用如下方法:
talkback = Talkback.find(params[:id])
if talkback
if talkback.belongs_to_user?
# do stuff
else
# talkback doesn't belong to signed in user
end
else
# no talkback exists with that id in the database
end
def belongs_to_user?(user = current_user)
self.comment.post.user == user
end
如果未指定方法参数,则此方法将当前登录用户用作默认值。
答案 2 :(得分:0)
为什么不将user_id添加到talkbacks表中,然后设置它们之间的关联。我认为这会让你的生活变得更轻松,然后尝试深入嵌套。 (我还会考虑将Talkbacks类的名称更改为单数“Talkback”,以便您坚持使用Rails的命名约定。)
class User < ApplicationRecord
has_many :posts
has_many :talkbacks
end
class Talkback
belongs_to :comment
belongs_to :user
end
然后你可以打电话:
# /talkbacks/:id
current_user.talkbacks.find_by_id!(params_id)
答案 3 :(得分:0)
你可以用has_many来完成这个:通过。 看看这个post。