首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 3关联

Rails 3关联
EN

Stack Overflow用户
提问于 2011-01-12 19:38:25
回答 1查看 641关注 0票数 1
代码语言:javascript
复制
class User < ActiveRecord::Base
  has_many :books
  has_many :book_users
  has_many :books, :through => :book_users
end

class Book < ActiveRecord::Base
  belongs_to :user
  has_many :book_users
  has_many :users, :through => :book_users
end

用户可以写多本书一本书只能属于一个用户用户可以是不同书籍的读者一本书可以由不同用户阅读

代码语言:javascript
复制
User.books 

应该给我用户写的书

代码语言:javascript
复制
User.books_read

应该给我的书,都是这个用户读的

如何做到这一点?

第二个问题,从用户中删除book_read的最简单方法是什么?我是说

代码语言:javascript
复制
User.method_name(book_id) # what's the method name ?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-12 20:57:42

第一个问题:

您可以使用:source:class_name

代码语言:javascript
复制
has_many :books_read, :class_name => "Book", :through => :book_users

我不确定:class_name是否能与has_many :through一起工作。如果它不起作用,试试这个:

代码语言:javascript
复制
has_many :books_read, :source => :book, :through => :book_users

这应该能起到作用。

第二个问题:

据我所知,没有一种简单的方法可以从books_read关系中删除图书。您可以创建自己的方法来完成此任务。只需确保从:book_users中删除记录,而不是从has_many :through关系中删除。否则,书籍本身将被删除。

代码语言:javascript
复制
def delete_book(book_id)
  self.book_users.find_by_book_id(book_id).destroy
end

当使用Rails3时,你不能使用find_by_...助手,而需要使用where

代码语言:javascript
复制
def delete_book(book_id)
  self.book_users.where(:book_id => book_id).destroy
end

现在,您可以按如下方式调用此函数:

代码语言:javascript
复制
User.find(1).delete_book(2)

我希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4668327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档