这是在这个先前的问题之后得到回答的.我实际上发现我可以从该查询中删除一个连接,所以现在工作查询是
start_cards = DeckCard.find :all, :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
Run Code Online (Sandbox Code Playgroud)
这似乎有效.但是,当我尝试将这些DeckCards移动到另一个关联时,我得到ActiveRecord :: ReadOnlyRecord错误.
这是代码
for player in @game.players
player.tableau = Tableau.new
start_card = start_cards.pop
start_card.draw_pile = false
player.tableau.deck_cards << start_card # the error occurs on this line
end
Run Code Online (Sandbox Code Playgroud)
和相关的模特(画面是桌上的球员卡)
class Player < ActiveRecord::Base
belongs_to :game
belongs_to :user
has_one :hand
has_one :tableau
end
class Tableau < ActiveRecord::Base
belongs_to :player
has_many :deck_cards
end
class DeckCard < ActiveRecord::Base
belongs_to :card
belongs_to :deck …
Run Code Online (Sandbox Code Playgroud) 在rails指南中,它的描述如下:
如果对象与之关联,则会另外销毁对象,如果与之关联则
:dependent => :destroy
删除对象:dependent => :delete_all
对,很酷.但被摧毁和被删除之间的区别是什么?我试过两个,它似乎做同样的事情.
在这个例子中,我创建了一个user
没有profile
,然后在profile
为该用户创建一个.我尝试使用带有has_one
关联的构建,但是爆炸了.我看到这个工作的唯一方法是使用has_many
.本user
应该只有最多只能有一个profile
.
我一直在尝试这个.我有:
class User < ActiveRecord::Base
has_one :profile
end
class Profile < ActiveRecord::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
但当我这样做时:
user.build_profile
Run Code Online (Sandbox Code Playgroud)
我收到错误:
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'profiles.user_id' in 'where clause': SELECT * FROM `profiles` WHERE (`profiles`.user_id = 4) LIMIT 1
Run Code Online (Sandbox Code Playgroud)
在rails中有一种方法可以有0或1个关联吗?
你会如何与MongoDB进行多对多的关联?
例如; 假设您有一个Users表和一个Roles表.用户有很多角色,角色有很多用户.在SQL中,您将创建一个UserRoles表.
Users:
Id
Name
Roles:
Id
Name
UserRoles:
UserId
RoleId
Run Code Online (Sandbox Code Playgroud)
MongoDB中如何处理相同类型的关系?
在Rails 3 文档中,build
关联方法被描述为与new
方法相同,但是自动分配外键.直接来自文档:
Firm#clients.build (similar to Client.new("firm_id" => id))
Run Code Online (Sandbox Code Playgroud)
我在其他地方读过类似的内容.
然而,当我使用new
(例如,some_firm.clients.new
不带任何参数),新的客户端的firm_id
关联被自动创建.我现在正在控制台中盯着结果!
我错过了什么吗?文档是否有点过时(不太可能)?build
和之间有什么区别new
?
单向和双向关联有什么区别?
由于在db中生成的表都是相同的,因此我发现的唯一区别是双向关联的每一侧都将引用另一侧,而单向不引用.
这是一个单向关联
public class User {
private int id;
private String name;
@ManyToOne
@JoinColumn(
name = "groupId")
private Group group;
}
public class Group {
private int id;
private String name;
}
Run Code Online (Sandbox Code Playgroud)
双向关联
public class User {
private int id;
private String name;
@ManyToOne
@JoinColumn(
name = "groupId")
private Group group;
}
public class Group {
private int id;
private String name;
@OneToMany(mappedBy="group")
private List<User> users;
}
Run Code Online (Sandbox Code Playgroud)
区别在于该组是否拥有用户的参考.
所以我想知道这是唯一的区别吗?哪个推荐?
鉴于以下内容
class User < ActiveRecord::Base
has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
has_and_belongs_to_many :users
end
Run Code Online (Sandbox Code Playgroud)
您如何为公司和用户定义工厂,包括双向关联?这是我的尝试
Factory.define :company do |f|
f.users{ |users| [users.association :company]}
end
Factory.define :user do |f|
f.companies{ |companies| [companies.association :user]}
end
Run Code Online (Sandbox Code Playgroud)
现在我试试
Factory :user
Run Code Online (Sandbox Code Playgroud)
也许不出所料,这会导致无限循环,因为工厂递归地使用彼此来定义自己.
更令人惊讶的是,我没有提到如何在任何地方做到这一点,是否有一种模式来定义必要的工厂或我做了一些从根本上错误的事情?
ruby-on-rails associations has-and-belongs-to-many factory-bot
所以我在学校的课程中有这样的create_table:
create_table :courses do |t|
t.string :name
t.references :course
t.timestamps
end
Run Code Online (Sandbox Code Playgroud)
但是我想要它参考另外两个课程,如:
has_many :transferrable_as # A Course
has_many :same_as # Another Course
Run Code Online (Sandbox Code Playgroud)
我可以说以下吗?
t.references :transferrable_as, :as=> :course
Run Code Online (Sandbox Code Playgroud) 你能告诉我创建has_one关系的最佳做法吗?
如果我有一个用户模型,它必须有一个配置文件...
我怎么能做到这一点?
一个解决方案是:
# user.rb
class User << ActiveRecord::Base
after_create :set_default_association
def set_default_association
self.create_profile
end
end
Run Code Online (Sandbox Code Playgroud)
但这似乎不是很干净......有什么建议吗?
ruby activerecord ruby-on-rails associations ruby-on-rails-3
associations ×10
ruby ×3
activerecord ×2
aggregation ×1
composition ×1
factory-bot ×1
has-one ×1
hibernate ×1
java ×1
join ×1
jpa ×1
many-to-many ×1
migration ×1
model ×1
mongodb ×1
oop ×1
orm ×1
uml ×1