2016-07-04 21 views
0
# == Schema Information 
# 
# Table name: books 
# id   :integer 
# owner_id  :integer 

# Table name: users 
# id   :integer 
# name   :string 

# Table name: shared_books_records 
# user_id  :integer 
# book_id  :integer 

books 
id: 1, owner_id: 1 # jack 
id: 2, owner_id: 2 # tom 
id: 3, owner_id: 1 # jack 

users 
id: 1, name: "jack" 
id: 2, name: "tom" 

ジャックには2冊の書籍があり、トムには1冊の本があります。activerecordのhas_many定義でprimary_valueの値を取得するにはどうすればよいですか?

だからジャックはトムの本を借りた。今、ジャックには3冊の本があります。

class User 
    def all_books 
    join_sql = <<-SQL.squish! 
     LEFT OUTER JOIN shared_books_records 
     ON shared_books_records.user_id = books.assignee_id 
    SQL 
    condition = <<-SQL.squish! 
     books.owner_id = :user_id OR 
     shared_books_records.user_id = user_id 
    SQL 

    Book.joins(join_sql).where(condition, user_id: id) 
    end 
end 

私はそれほど良くないと思いますが、activerecordの方がいいです。だから私はそれを再定義したい。

has_many :all_books, 
     -> { 
      primary_key_value = xxxx # I want to get this value 

      join_sql = <<-SQL.squish! 
      LEFT OUTER JOIN shared_books_records 
       ON shared_books_records.user_id = books.assignee_id 
      SQL 

      condition = <<-SQL.squish! 
      books.owner_id = :user_id OR 
      shared_books_records.user_id = user_id 
      SQL 

      joins(join_sql).unscope(:where).where(condition, user_id: primary_key_value) 
     }, 
     class_name: Book, foreign_key: :owner_id 

しかし、私はスコープにprimary_keyの値を取得する方法がわかりません。


私のソリューション

has_many :all_books, 
    -> (user) { 
     primary_key_value = user.id # I want to get this value 

     join_sql = <<-SQL.squish! 
     LEFT OUTER JOIN shared_books_records 
      ON shared_books_records.user_id = books.assignee_id 
     SQL 

     condition = <<-SQL.squish! 
     books.owner_id = :user_id OR 
     shared_books_records.user_id = :user_id 
     SQL 

     joins(join_sql).unscope(:where).where(condition, user_id: primary_key_value) 
    }, 
    class_name: Book, foreign_key: :owner_id 
+0

にhas_manyのように行うことができますすべての書籍を取得するには:all_books、CLASS_NAME:ブック、FOREIGN_KEYを::これが戻りますOWNER_ID tableのすべての列とprimary_keyが含まれているので、current_user.all_booksはすべてを返します – chaitanya

答えて

0

あなたは、単にこの

class User 
    has_many :user_books 
    has_many :books, through: :user_books 
end 

class UserBook 
    belongs_to :books 
    belongs_to :users 
end 

class Book 
    has_many :user_books 
    has_many :users, through: :user_books 
end 

# Table name: books 
# id   :integer 
# owner_id  :integer 

# Table name: users 
# id   :integer 

# Table name: user_books (previously shared_books_record) 
# user_id  :integer 
# book_id  :integer 


def all_ books 
    #lets say id has value for user_id 
    user = User.find(id) 
    all_books = user.books #this should return an array of all books which belongs to the current user 
end 
0
class User 
    has_many :user_books 
    has_many :books, through: :user_books 
end 

class UserBook 
    belongs_to :books 
    belongs_to :users 
end 

class Book 
    has_many :user_books 
    has_many :users, through: :user_books 
end 
+1

コードのみnswersはスタックオーバーフローで品質の低いコンテンツとみなされます。 *なぜ*これが質問に答えるかについての情報を提供してください。 –

関連する問題